0001 function [y]=axpx(a,x)
0002
0003
0004
0005
0006
0007 d=x.d;
0008 n=a.n;
0009 m=a.m;
0010 rx=x.r;
0011 psx=x.ps;
0012 att=a.tt;
0013 corea=att.core;
0014 psa=att.ps;
0015 ra=att.r;
0016
0017
0018 corex=x.core;
0019 pos1=psx(d+1);
0020 psi=cell(d+1,1);
0021 psi{d+1}=1; psi{1}=1;
0022 cr1=corex(psx(d):psx(d+1)-1);
0023 y=x;
0024 corey=y.core;
0025 psy=y.ps;
0026 ry=y.r;
0027 for i=d:-1:2
0028
0029 cr2=corey(psy(i-1):psy(i)-1);
0030 cr1=reshape(cr1,[ry(i),n(i)*ry(i+1)]);
0031 cr2=reshape(cr2,[ry(i-1)*n(i-1),ry(i)]);
0032 cr1=cr1.';
0033 [q,rm]=qr(cr1,0); rn=size(q,2); rm=rm.';
0034 q=q.';
0035 ry(i)=rn;
0036 corey(pos1-ry(i+1)*n(i)*ry(i):pos1-1)=q(:);
0037
0038
0039 cra=corea(psa(i):psa(i+1)-1); cra=reshape(cra,[ra(i),n(i),m(i),ra(i+1)]);
0040 cry=reshape(conj(q),[ry(i),n(i),ry(i+1)]);
0041 crx=corex(psx(i):psx(i+1)-1);
0042 crx=reshape(crx,[rx(i),m(i),rx(i+1)]);
0043 pscur=psi{i+1}; pscur=reshape(pscur,[ra(i+1),rx(i+1),ry(i+1)]);
0044
0045 crx=reshape(crx,[rx(i)*m(i),rx(i+1)]);
0046 pscur=permute(pscur,[2,1,3]); pscur=reshape(pscur,[rx(i+1),ra(i+1)*ry(i+1)]);
0047 pscur=crx*pscur;
0048
0049 pscur=reshape(pscur,[rx(i),m(i)*ra(i+1),ry(i+1)]);
0050 pscur=permute(pscur,[1,3,2]);
0051 pscur=reshape(pscur,[rx(i)*ry(i+1),m(i)*ra(i+1)]);
0052 cra=reshape(cra,[ra(i)*n(i),m(i)*ra(i+1)]); cra=cra.';
0053 pscur=pscur*cra;
0054
0055
0056 pscur=reshape(pscur,[rx(i),ry(i+1),ra(i),n(i)]);
0057 pscur=permute(pscur,[3,1,4,2]);
0058 pscur=reshape(pscur,[ra(i)*rx(i),n(i)*ry(i+1)]);
0059 cry=reshape(cry,[ry(i),n(i)*ry(i+1)]); cry=cry.';
0060 pscur=pscur*cry;
0061 pscur=reshape(pscur,[rx(i),ra(i),ry(i)]);
0062 psi{i}=pscur;
0063
0064 pos1=pos1-ry(i+1)*n(i)*ry(i);
0065 cr1=cr2*rm;
0066 end
0067 corey(pos1-ry(2)*n(1)*ry(1):pos1-1)=cr1(:);
0068 pos1=pos1-ry(2)*n(1)*ry(1);
0069 corey=corey(pos1:end);
0070
0071 pos1=1;
0072 psy=cumsum([1;n.*ry(1:d).*ry(2:d+1)]);
0073 rm=1;
0074
0075 for i=1:d
0076
0077
0078
0079
0080
0081 ps1=psi{i}; ps2=psi{i+1};
0082 cra=corea(psa(i):psa(i+1)-1);
0083 crx=corex(psx(i):psx(i+1)-1);
0084
0085
0086
0087
0088 ps1=reshape(ps1,[ra(i),rx(i),ry(i)]);
0089 ps1=permute(ps1,[2,3,1]);
0090 ps1=reshape(ps1,[rx(i)*ry(i),ra(i)]);
0091 cra=reshape(cra,[ra(i),n(i)*m(i)*ra(i+1)]);
0092 cry=ps1*cra;
0093
0094 cry=reshape(cry,[rx(i),ry(i),n(i),m(i),ra(i+1)]);
0095 cry=permute(cry,[2,3,5,1,4]);
0096 cry=reshape(cry,[ry(i)*n(i)*ra(i+1),rx(i)*m(i)]);
0097 crx=reshape(crx,[rx(i)*m(i),rx(i+1)]);
0098 cry=cry*crx; cry0=cry;
0099
0100 cry=reshape(cry,[ry(i)*n(i),ra(i+1)*rx(i+1)]);
0101 ps2=reshape(ps2,[ra(i+1)*rx(i+1),ry(i+1)]);
0102
0103
0104 cry=cry*ps2;
0105 corey(pos1:pos1+ry(i)*n(i)*ry(i+1)-1)=cry(:);
0106 y.core=corey;
0107 psy=cumsum([1;n.*ry(1:d).*ry(2:d+1)]);
0108 y.ps=psy;
0109
0110
0111 cry=reshape(cry,[ry(i)*n(i),ry(i+1)]);
0112 [q,rm]=qr(cry,0);
0113 rn=size(q,2);
0114 ry(i+1)=rn;
0115
0116 corey(pos1:pos1+ry(i)*n(i)*ry(i+1)-1)=q(:);
0117 pos1=pos1+ry(i)*n(i)*ry(i+1);
0118
0119
0120
0121
0122
0123
0124 cry0=reshape(cry0,[ry(i),n(i),ra(i+1),rx(i+1)]);
0125 cry0=permute(cry0,[3,4,1,2]);
0126 cry0=reshape(cry0,[ra(i+1)*rx(i+1),ry(i)*n(i)]);
0127 q=reshape(conj(q),[ry(i)*n(i),ry(i+1)]);
0128 psi{i+1}=cry0*q;
0129
0130 end
0131 psy=cumsum([1;n.*ry(1:d).*ry(2:d+1)]);
0132 corey(psy(i):psy(i+1)-1)=corey(psy(i):psy(i+1)-1)*rm;
0133 y.core=corey;
0134 y.r=ry;
0135 y.ps=psy;
0136 y.n=n;
0137 y.d=d;
0138 return
0139 end