0001 function x = from_array(A,opt)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 n = size(A);
0019 d = length(n);
0020
0021 if length(opt) == 1
0022 useTol = true;
0023 tol = opt;
0024 r = ones(1,d+1);
0025 else
0026 useTol = false;
0027 r = opt;
0028 if r(1) ~= 1 || r(d+1) ~= 1
0029 error('Invalid rank specified')
0030 end
0031 end
0032
0033 U = cell(1,d);
0034
0035
0036
0037 A = reshape( A, n(1), prod(n(2:end)));
0038 [u,s,v] = svd(A,'econ');
0039 if useTol
0040 r(2) = trunc_singular( diag(s), tol );
0041 end
0042 U{1} = reshape( u(:,1:r(2)), [1, n(1), r(2)] );
0043 A = s(1:r(2),1:r(2))*v(:,1:r(2))';
0044
0045
0046 for i = 2:d-1
0047 A = reshape( A, n(i)*r(i), prod(n(i+1:end)));
0048 [u,s,v] = svd(A,'econ');
0049 if useTol
0050 r(i+1) = trunc_singular( diag(s), tol );
0051 end
0052 U{i} = reshape( u(:,1:r(i+1)), [r(i), n(i), r(i+1)] );
0053 A = s(1:r(i+1),1:r(i+1)) * v(:,1:r(i+1))';
0054 end
0055
0056
0057 U{d} = reshape(A, [r(d), n(d), 1]);
0058
0059 x = TTeMPS( U );
0060 end