0001 function [tt,rm]=qr(tt,op)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 d=tt.d;
0021 r=tt.r;
0022 cr=tt.core;
0023 ps=tt.ps;
0024 n=tt.n;
0025 if ( strcmp(op,'lr') || strcmp(op,'LR'))
0026
0027 core0=cr(ps(1):ps(2)-1);
0028 pos1=1;
0029 for i=1:d-1
0030 core0=reshape(core0,[r(i)*n(i),r(i+1)]);
0031 [core0,ru]=qr(core0,0);
0032
0033 core1=cr(ps(i+1):ps(i+2)-1);
0034 core1=reshape(core1,[r(i+1),n(i+1)*r(i+2)]);
0035 core1=ru*core1;
0036 r(i+1)=size(core0,2);
0037 cr(pos1:pos1-1+r(i)*n(i)*r(i+1))=core0(:);
0038 cr(pos1+r(i)*n(i)*r(i+1):pos1+r(i)*n(i)*r(i+1)+r(i+1)*n(i+1)*r(i+2)-1)=core1(:);
0039 core0=core1;
0040 pos1=pos1+r(i)*n(i)*r(i+1);
0041 end
0042
0043 core0=cr(pos1:pos1-1+r(d)*n(d)*r(d+1));
0044 core0=reshape(core0,[r(d)*n(d),r(d+1)]);
0045 [core0,rm]=qr(core0,0);
0046 r(d+1)=size(core0,2);
0047 cr(pos1:pos1+r(d)*n(d)*r(d+1)-1)=core0(:);
0048 pos1=pos1+r(d)*n(d)*r(d+1)-1;
0049 cr=cr(1:pos1);
0050 tt.core=cr; tt.r=r;
0051 tt.ps=cumsum([1;tt.n.*tt.r(1:d).*tt.r(2:d+1)]);
0052 return
0053 elseif (strcmp (op,'rl') || strcmp(op,'RL') )
0054
0055 rm=1;
0056 pos1=ps(d+1)-1;
0057 for i=d:-1:1
0058 cr1=cr(ps(i):ps(i+1)-1);
0059 cr1=reshape(cr1,[r(i)*n(i),r(i+1)]);
0060 cr1=cr1*rm;
0061 r(i+1)=size(cr1,2);
0062 cr1=reshape(cr1,[r(i),n(i)*r(i+1)]);
0063 cr1=cr1.';
0064 [u,rm]=qr(cr1,0);
0065 rm=rm.';
0066 rnew=size(u,2);
0067 u=u.';
0068 cr(pos1-r(i+1)*n(i)*rnew+1:pos1)=u(:);
0069 pos1=pos1-r(i+1)*n(i)*rnew;
0070 end
0071 pos1 = pos1+1;
0072
0073 cr=cr(pos1:end);
0074 ps=cumsum([1;(n).*r(1:d).*r(2:d+1)]);
0075 tt.core=cr;
0076 tt.r=r;
0077 tt.ps=ps;
0078 return
0079 else
0080 error('Option is not supported (yet)');
0081 end