0001 function [res] = tt_als(x,y,nswp)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 x=core(x); y=core(y);
0020 d=size(x,1);
0021
0022
0023 phi=cell(d,1);
0024
0025 [q,rv]=qr(y{1},0);
0026 y{1}=q;
0027
0028 phi{1}=y{1}'*x{1};
0029 for i=2:d-1
0030
0031 y{i} = ten_conv(y{i},2,rv');
0032 ncur=size(y{i},1);
0033 r2=size(y{i},2);
0034 r3=size(y{i},3);
0035 core1=permute(y{i},[1,2,3]);
0036 core1=reshape(core1,[ncur*r2,r3]);
0037 [y{i},rv]=qr(core1,0);
0038 rnew=min(r3,ncur*r2);
0039 y{i}=reshape(y{i},[ncur,r2,rnew]);
0040 y{i}=permute(y{i},[1,2,3]);
0041 n=size(x{i},1); rx1=size(x{i},2); rx2=size(x{i},3);
0042 ry1=size(y{i},2); ry2=size(y{i},3);
0043
0044 phi{i}=phi{i-1}*reshape(permute(x{i}, [2,1,3]),[rx1,n*rx2]);
0045
0046 phi{i}=permute(reshape(phi{i},[ry1,n,rx2]),[2,1,3]);
0047 phi{i}=reshape(y{i},[n*ry1,ry2])'*reshape(phi{i},[n*ry1,rx2]);
0048 end
0049
0050
0051 for s=1:nswp
0052
0053 y{d}= x{d}*phi{d-1}';
0054
0055
0056
0057 [q,rv]=qr(y{d},0);
0058 y{d}=q;
0059
0060 phi{d}=y{d}'*x{d};
0061
0062
0063
0064 for i=d-1:-1:2
0065
0066
0067
0068
0069
0070
0071 phi0=ten_conv(x{i},3,phi{i+1}');
0072
0073
0074
0075 y{i}=ten_conv(phi0,2,phi{i-1}');
0076
0077 ncur=size(y{i},1);
0078 r2=size(y{i},2);
0079 r3=size(y{i},3);
0080 core1=permute(y{i},[1,3,2]);
0081 core1=reshape(core1,[ncur*r3,r2]);
0082 [y{i},rv]=qr(core1,0);
0083 rnew=min(r2,ncur*r3);
0084 y{i}=reshape(y{i},[ncur,r3,rnew]);
0085 y{i}=permute(y{i},[1,3,2]);
0086
0087
0088 ncur=size(x{i},1); rx1=size(x{i},2);
0089 ry1=size(y{i},2); ry2=size(phi{i+1},1);
0090
0091
0092
0093
0094
0095
0096
0097 phi0=permute(reshape(phi0,[ncur,rx1,ry2]),[1,3,2]);
0098 phi{i}=reshape(permute(y{i},[1,3,2]),[ncur*ry2,ry1])'*reshape(phi0,[ncur*ry2,rx1]);
0099
0100
0101 end
0102 y{1} = x{1}*phi{2}';
0103
0104 [q,rv]=qr(y{1},0);
0105 y{1}=q;
0106
0107 phi{1}=y{1}'*x{1};
0108
0109 for i=2:d-1
0110
0111 y{i}=ten_conv(x{i},3,phi{i+1}');
0112 y{i}=ten_conv(y{i},2,phi{i-1}');
0113
0114
0115
0116 ncur=size(y{i},1);
0117 r2=size(y{i},2);
0118 r3=size(y{i},3);
0119 core1=permute(y{i},[1,2,3]);
0120 core1=reshape(core1,[ncur*r2,r3]);
0121 [y{i},rv]=qr(core1,0);
0122 rnew=min(r3,ncur*r2);
0123 y{i}=reshape(y{i},[ncur,r2,rnew]);
0124 y{i}=permute(y{i},[1,2,3]);
0125
0126 n=size(x{i},1); rx1=size(x{i},2); rx2=size(x{i},3);
0127 ry1=size(y{i},2); ry2=size(y{i},3);
0128
0129 phi{i}=phi{i-1}*reshape(permute(x{i}, [2,1,3]),[rx1,n*rx2]);
0130
0131 phi{i}=permute(reshape(phi{i},[ry1,n,rx2]),[2,1,3]);
0132 phi{i}=reshape(y{i},[n*ry1,ry2])'*reshape(phi{i},[n*ry1,rx2]);
0133 end
0134
0135
0136 end
0137 y{d}= x{d}*phi{d-1}';
0138 res=y;
0139 res=tt_tensor(res);
0140 return
0141 end