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.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.7401    0.6725
   -0.6725    0.7401

nvecs(full(X),4,2) %<-- Same thing for a dense tensor
ans =

    0.7401    0.6725
   -0.6725    0.7401

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) = 
	    0.0974   -0.0452   -0.1786
	   -0.3189    0.0200   -0.0393
	   -0.0932    0.5059   -0.2194
	   -0.0911   -0.2314    0.0560
		Y.core(:,:,2) = 
	   -0.0282    0.0852    0.0013
	    0.0848    0.3216   -0.0229
	   -0.1012   -0.1193    0.0669
	   -0.0009    0.0684    1.9279
	Y.U{1} = 
		    0.0424   -0.6031   -0.4132    0.6809
		    0.1799   -0.2230    0.8973    0.3358
		    0.9126    0.3452   -0.1551    0.1548
		   -0.3647    0.6836    0.0064    0.6321
	Y.U{2} = 
		   -0.1521    0.8780    0.4538
		   -0.5319   -0.4597    0.7111
		    0.8330   -0.1332    0.5370
	Y.U{3} = 
		    0.8409    0.5412
		   -0.5412    0.8409
norm(full(Y) - X) %<-- Reproduces the same result.
ans =

   9.0558e-16

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) = 
	    0.0560   -0.2314
	   -0.2194    0.5059
		Y.core(:,:,2) = 
	    1.9279    0.0684
	    0.0669   -0.1193
	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.8409    0.5412
		   -0.5412    0.8409
100*(1-norm(full(Y)-X)/norm(X)) %<-- Percentage explained by approximation
ans =

   74.1571