0001 function [fc,core]=qtt_tucker_m(tt, sz, tol)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 d = tt.d;
0020 n = tt.n;
0021 rcr = tt.r;
0022
0023 fc = cell(d,1);
0024
0025
0026 for i=1:d-1
0027 cr = tt{i};
0028 cr = reshape(cr, rcr(i)*n(i), rcr(i+1));
0029 [cr, rv]=qr(cr, 0);
0030 cr2 = tt{i+1};
0031 cr2 = rv*reshape(cr2, rcr(i+1), n(i+1)*rcr(i+2));
0032 rcr(i+1) = size(cr,2);
0033 tt{i} = reshape(cr, rcr(i), n(i), rcr(i+1));
0034 tt{i+1} = reshape(cr2, rcr(i+1), n(i+1), rcr(i+2));
0035 end;
0036
0037
0038 core = tt;
0039 nextcr = core{d};
0040 rtuck = zeros(d,1);
0041 for i=d:-1:1
0042 cr = nextcr;
0043 cr = permute(cr, [2, 1, 3]);
0044 cr = reshape(cr, n(i), rcr(i)*rcr(i+1));
0045 [u,s,v]=svd(cr, 'econ');
0046 s = diag(s);
0047 nrm = norm(s);
0048 r = my_chop2(s, tol*nrm);
0049 rtuck(i) = r;
0050 if (i>1)
0051 fc{i} = u(:,1:r);
0052 cr = diag(s(1:r))*v(:,1:r)';
0053 cr = reshape(cr, r, rcr(i), rcr(i+1));
0054 cr = permute(cr, [1, 3, 2]);
0055 cr = reshape(cr, r*rcr(i+1), rcr(i));
0056 [cr,rv] = qr(cr, 0);
0057 cr2 = core{i-1};
0058 cr2 = reshape(cr2, rcr(i-1)*n(i-1), rcr(i));
0059 cr2 = cr2*(rv.');
0060 rcr(i) = size(cr, 2);
0061 nextcr = reshape(cr2, rcr(i-1), n(i-1), rcr(i));
0062 cr = reshape(cr, r, rcr(i+1), rcr(i));
0063 core{i} = permute(cr, [3, 1, 2]);
0064 else
0065 cr = v(:,1:r)';
0066 cr = reshape(cr, r, rcr(i), rcr(i+1));
0067 core{i} = permute(cr, [2, 1, 3]);
0068 fc{i} = u(:,1:r)*diag(s(1:r));
0069 end;
0070 end;
0071
0072
0073 for i=1:d
0074
0075 fc{i} = tt_tensor(fc{i});
0076 szc=sz{i}; d0=numel(szc); m0=szc(end); szc=szc(:);
0077
0078 fc{i}=tt_reshape(fc{i},[szc(1:end-1); m0*rtuck(i)],tol);
0079 nocore = fc{i}{d0};
0080 rqtt = size(nocore, 1);
0081 if (i<d)
0082
0083 nocore = reshape(nocore, rqtt*m0, rtuck(i));
0084 [ocore, nocore]=qr(nocore, 0);
0085 cr1 = core{i};
0086 cr1 = permute(cr1, [2, 1, 3]);
0087 cr1 = reshape(cr1, rtuck(i), rcr(i)*rcr(i+1));
0088 cr1 = nocore*cr1;
0089 rtuck(i) = size(cr1, 1);
0090 fc{i}{d0} = reshape(ocore, rqtt, m0, rtuck(i));
0091
0092 cr1 = reshape(cr1, rtuck(i)*rcr(i), rcr(i+1));
0093 [cr1, rv]=qr(cr1, 0);
0094 cr2 = core{i+1};
0095 cr2 = reshape(cr2, rcr(i+1), rtuck(i+1)*rcr(i+2));
0096 cr2 = rv*cr2;
0097 rcr(i+1) = size(cr1, 2);
0098 cr1 = reshape(cr1, rtuck(i), rcr(i), rcr(i+1));
0099 core{i} = permute(cr1, [2,1,3]);
0100 cr2 = reshape(cr2, rcr(i+1), rtuck(i+1), rcr(i+2));
0101 cr2 = permute(cr2, [1, 3, 2]);
0102 cr2 = reshape(cr2, rcr(i+1)*rcr(i+2), rtuck(i+1));
0103 [cr2, rv]=qr(cr2, 0);
0104 fc{i+1} = fc{i+1}*(rv.');
0105 rtuck(i+1) = size(cr2, 2);
0106 cr2 = reshape(cr2, rcr(i+1), rcr(i+2), rtuck(i+1));
0107 core{i+1} = permute(cr2, [1, 3, 2]);
0108 else
0109 fc{i}{d0} = reshape(nocore, rqtt, m0, rtuck(i));
0110 end;
0111 end;
0112
0113 end