Generating the Leading Mode-n Vectors
The leading mode-n vectors are those vectors that span the subspace of the mode-n fibers. In other words, the left singular vectors of the n-mode matricization of X.
Contents
Using nvecs to calculate the leading mode-n vectors
The nvecs command efficient computes the leading n-mode vectors.
rand('state',0); X = sptenrand([4,3,2],6) %<-- A sparse tensor
X is a sparse tensor of size 4 x 3 x 2 with 6 nonzeros (1,2,1) 0.8385 (2,3,1) 0.5681 (3,2,1) 0.3704 (3,3,1) 0.7027 (4,2,2) 0.5466 (4,3,2) 0.4449
nvecs(X,1,2) %<-- The 2 leading mode-1 vectors
ans = 0.5810 0.7687 0.3761 -0.5451 0.7219 -0.3347 0 0
nvecs(X,1,3) % <-- The 3 leading mode-1 vectors
ans = 0.5810 0.7687 0 0.3761 -0.5451 0 0.7219 -0.3347 0 0 0 1.0000
nvecs(full(X),1,3) %<-- The same thing for a dense tensor
ans = 0.5810 0.7687 0 0.3761 -0.5451 0 0.7219 -0.3347 0 0 0 1.0000
X = ktensor({rand(3,2),rand(3,2),rand(2,2)}) %<-- A random ktensor
X is a ktensor of size 3 x 3 x 2 X.lambda = 1 1 X.U{1} = 0.6946 0.9568 0.6213 0.5226 0.7948 0.8801 X.U{2} = 0.1730 0.2523 0.9797 0.8757 0.2714 0.7373 X.U{3} = 0.1365 0.8939 0.0118 0.1991
nvecs(X,2,1) %<-- The 1 leading mode-2 vector
ans = 0.2122 0.7739 0.5967
nvecs(full(X),2,1) %<-- Same thing for a dense tensor
ans = 0.2122 0.7739 0.5967
X = ttensor(tenrand([2,2,2,2]),{rand(3,2),rand(3,2),rand(2,2),rand(2,2)}); %<-- A random ttensor
nvecs(X,4,2) %<-- The 1 leading mode-2 vector
ans = 0.7411 -0.6714 0.6714 0.7411
nvecs(full(X),4,2) %<-- Same thing for a dense tensor
ans = 0.7411 -0.6714 0.6714 0.7411
Using nvecs for the HOSVD
X = tenrand([4 3 2]) %<-- Generate data
X is a tensor of size 4 x 3 x 2 X(:,:,1) = 0.2140 0.7266 0.4399 0.6435 0.4120 0.9334 0.3200 0.7446 0.6833 0.9601 0.2679 0.2126 X(:,:,2) = 0.8392 0.6072 0.4514 0.6288 0.6299 0.0439 0.1338 0.3705 0.0272 0.2071 0.5751 0.3127
U1 = nvecs(X,1,4); %<-- Mode 1 U2 = nvecs(X,2,3); %<-- Mode 2 U3 = nvecs(X,3,2); %<-- Mode 3 S = ttm(X,{pinv(U1),pinv(U2),pinv(U3)}); %<-- Core Y = ttensor(S,{U1,U2,U3}) %<-- HOSVD of X
Y is a ttensor of size 4 x 3 x 2 Y.core is a tensor of size 4 x 3 x 2 Y.core(:,:,1) = 2.3791 -0.0479 -0.0295 0.0430 0.4256 0.0747 0.0387 0.1653 -0.0995 -0.0565 0.1769 0.2201 Y.core(:,:,2) = 0.1400 0.2010 -0.4216 -0.1373 -0.6148 -0.1499 0.4845 -0.0831 0.3278 0.1671 0.1620 -0.2217 Y.U{1} = 0.5386 -0.5134 0.6640 -0.0731 0.5965 0.0359 -0.3783 0.7070 0.4189 -0.2256 -0.5863 -0.6557 0.4227 0.8272 0.2687 -0.2548 Y.U{2} = 0.6086 0.7876 0.0967 0.6145 -0.3907 -0.6854 0.5020 -0.4765 0.7217 Y.U{3} = 0.8206 -0.5715 0.5715 0.8206
norm(full(Y) - X) %<-- Reproduces the same result.
ans = 1.1516e-15
U1 = nvecs(X,1,2); %<-- Mode 1 U2 = nvecs(X,2,2); %<-- Mode 2 U3 = nvecs(X,3,2); %<-- Mode 3 S = ttm(X,{pinv(U1),pinv(U2),pinv(U3)}); %<-- Core Y = ttensor(S,{U1,U2,U3}) %<-- Rank-(2,2,2) HOSVD approximation of X
Y is a ttensor of size 4 x 3 x 2 Y.core is a tensor of size 2 x 2 x 2 Y.core(:,:,1) = 2.3791 -0.0479 0.0430 0.4256 Y.core(:,:,2) = 0.1400 0.2010 -0.1373 -0.6148 Y.U{1} = 0.5386 -0.5134 0.5965 0.0359 0.4189 -0.2256 0.4227 0.8272 Y.U{2} = 0.6086 0.7876 0.6145 -0.3907 0.5020 -0.4765 Y.U{3} = 0.8206 -0.5715 0.5715 0.8206
100*(1-norm(full(Y)-X)/norm(X)) %<-- Percentage explained by approximation
ans = 66.7999