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.838496 (2,3,1) 0.568072 (3,2,1) 0.370414 (3,3,1) 0.70274 (4,2,2) 0.546571 (4,3,2) 0.44488
nvecs(X,1,2) %<-- The 2 leading mode-1 vectors
ans =
0.5810 0.7687
0.3761 -0.5451
0.7219 -0.3347
0.0000 0.0000
nvecs(X,1,3) % <-- The 3 leading mode-1 vectors
ans =
0.5810 0.7687 0.0000
0.3761 -0.5451 -0.0000
0.7219 -0.3347 -0.0000
0.0000 -0.0000 1.0000
nvecs(full(X),1,3) %<-- The same thing for a dense tensor
ans =
0.5810 0.7687 0.0000
0.3761 -0.5451 0.0000
0.7219 -0.3347 0.0000
-0.0000 0.0000 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.1365 0.1991
0.0118 0.2987
0.8939 0.6614
X.U{2} =
0.2844 0.9883
0.4692 0.5828
0.0648 0.4235
X.U{3} =
0.5155 0.4329
0.3340 0.2259
nvecs(X,2,1) %<-- The 1 leading mode-2 vector
ans =
0.7147
0.6480
0.2633
nvecs(full(X),2,1) %<-- Same thing for a dense tensor
ans =
0.7147
0.6480
0.2633
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.6725 0.7401
0.7401 -0.6725
nvecs(full(X),4,2) %<-- Same thing for a dense tensor
ans =
0.6725 0.7401
0.7401 -0.6725
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.0272 0.6831 0.6085 0.3127 0.0928 0.0158 0.0129 0.0353 0.0164 0.3840 0.6124 0.1901 X(:,:,2) = 0.5869 0.7176 0.4418 0.0576 0.6927 0.3533 0.3676 0.0841 0.1536 0.6315 0.4544 0.6756
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) =
1.9279 0.0684 -0.0009
0.0669 -0.1193 -0.1012
-0.0229 0.3216 0.0848
0.0013 0.0852 -0.0282
Y.core(:,:,2) =
0.0560 -0.2314 -0.0911
-0.2194 0.5059 -0.0932
-0.0393 0.0200 -0.3189
-0.1786 -0.0452 0.0974
Y.U{1} =
0.6809 -0.4132 -0.6031 0.0424
0.3358 0.8973 -0.2230 0.1799
0.1548 -0.1551 0.3452 0.9126
0.6321 0.0064 0.6836 -0.3647
Y.U{2} =
0.4538 0.8780 -0.1521
0.7111 -0.4597 -0.5319
0.5370 -0.1332 0.8330
Y.U{3} =
0.5412 0.8409
0.8409 -0.5412
norm(full(Y) - X) %<-- Reproduces the same result.
ans = 1.2486e-015
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) =
1.9279 0.0684
0.0669 -0.1193
Y.core(:,:,2) =
0.0560 -0.2314
-0.2194 0.5059
Y.U{1} =
0.6809 -0.4132
0.3358 0.8973
0.1548 -0.1551
0.6321 0.0064
Y.U{2} =
0.4538 0.8780
0.7111 -0.4597
0.5370 -0.1332
Y.U{3} =
0.5412 0.8409
0.8409 -0.5412
100*(1-norm(full(Y)-X)/norm(X)) %<-- Percentage explained by approximation
ans = 74.1571