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
