0001 function [mx,ind_full]=tt_max_abs(tt)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 tt=core(tt);
0021 d=size(tt,1);
0022
0023
0024 tt1=tt;
0025 mat=tt1{1};
0026 [q,r]=qr(mat,0);
0027 tt1{1}=q;
0028 for i=2:d-1
0029 core1=tt1{i};
0030 core1=ten_conv(core1,2,r');
0031 ncur=size(core1,1);
0032 r2=size(core1,2);
0033 r3=size(core1,3);
0034 core1=reshape(core1,[ncur*r2,r3]);
0035 [tt1{i},r]=qr(core1,0);
0036 rnew=min(ncur*r2,r3);
0037 tt1{i}=reshape(tt1{i},[ncur,r2,rnew]);
0038 end
0039 mat=tt1{1};
0040 ind_left=cell(d,1);
0041 [ind]=maxvol2(mat);
0042 ind_left{1}=ind;
0043 ind_l=cell(d,1);
0044 r1=mat(ind,:);
0045 tt1{1}=mat/r1;
0046 ind_l{1}=ind;
0047 for i=2:d-1
0048 core1=tt1{i};
0049 ncur=size(core1,1);
0050 r2=size(core1,2);
0051 r3=size(core1,3);
0052 core1=ten_conv(core1,2,r1');
0053 core1=permute(core1,[2,1,3]);
0054 core1=reshape(core1,[r2*ncur,r3]);
0055 ind=maxvol2(core1);
0056
0057
0058 rnew=min(ncur*r2,r3);
0059 ind_new=zeros(i,r3);
0060 ind_old=ind_left{i-1};
0061 for s=1:rnew
0062 f_in=ind(s);
0063 w1=tt_ind2sub([r2,ncur],f_in);
0064 rs=w1(1); js=w1(2);
0065 ind_new(:,s)=[ind_old(:,rs)',js];
0066 end
0067 ind_left{i}=ind_new;
0068 r1=core1(ind,:);
0069 ind_l{i}=ind;
0070 tt1{i}=core1/r1;
0071 rnew=min(r2*ncur,rnew);
0072 tt1{i}=reshape(tt1{i},[r2,ncur,rnew]);
0073 tt1{i}=permute(tt1{i},[2,1,3]);
0074 end
0075
0076 tt2=tt;
0077 mat=tt2{d};
0078 [q,rv]=qr(mat,0);
0079 tt2{d}=q;
0080 for i=(d-1):-1:2
0081 core1=tt2{i};
0082 core1=ten_conv(core1,3,rv');
0083 ncur=size(core1,1);
0084 r2=size(core1,2);
0085 r3=size(core1,3);
0086 core1=permute(core1,[1,3,2]);
0087 core1=reshape(core1,[ncur*r3,r2]);
0088 [tt2{i},rv]=qr(core1,0);
0089 rnew=min(r2,ncur*r3);
0090 tt2{i}=reshape(tt2{i},[ncur,r3,rnew]);
0091 tt2{i}=permute(tt2{i},[1,3,2]);
0092 end
0093 tt2{1}=tt2{1}*rv';
0094
0095
0096
0097 mat=tt2{d};
0098 ind_right=cell(d,1);
0099 [ind]=maxvol2(mat);
0100 ind_right{d-1}=ind;
0101 r1=mat(ind,:);
0102
0103 ind_r=cell(d,1);
0104 tt2{d}=mat/r1;
0105 ind_r{d-1}=ind;
0106
0107 for i=(d-1):-1:2
0108 core1=tt2{i};
0109 ncur=size(core1,1);
0110 r2=size(core1,2);
0111 r3=size(core1,3);
0112 core1=ten_conv(core1,3,r1');
0113 core1=permute(core1,[3,1,2]);
0114 core1=reshape(core1,[r3*ncur,r2]);
0115 [ind]=maxvol2(core1);
0116 ind_old=ind_right{i};
0117 rnew=min(ncur*r3,r2);
0118 ind_new=zeros(d-i+1,rnew);
0119
0120 for s=1:rnew
0121 f_in=ind(s);
0122 w1=tt_ind2sub([r3,ncur],f_in);
0123 rs=w1(1); js=w1(2);
0124 ind_new(:,s)=[js,ind_old(:,rs)'];
0125 end
0126 ind_right{i-1}=ind_new;
0127 r1=core1(ind,:);
0128
0129 ind_r{i-1}=ind;
0130
0131 tt2{i}=core1/r1;
0132 rnew=min(ncur*r3,r2);
0133 tt2{i}=reshape(tt2{i},[r3,ncur,rnew]);
0134 tt2{i}=permute(tt2{i},[2,3,1]);
0135
0136 end
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 sbm_l=cell(d-1,1);
0163 sbm_r=cell(d-1,1);
0164 sbm_l{1}=tt{1}(ind_l{1},:);
0165 for k=2:d-1
0166 core1=tt{k};
0167 core1=ten_conv(core1,2,sbm_l{k-1}');
0168 ncur=size(core1,1); r2=size(core1,2); r3=size(core1,3);
0169 core1=reshape(permute(core1,[2,1,3]),[r2*ncur,r3]);
0170 sbm_l{k}=core1(ind_l{k},:);
0171 end
0172 sbm_r{d-1}=tt{d}(ind_r{d-1},:);
0173 for k=d-1:-1:2
0174 core1 = tt{k};
0175 core1=ten_conv(core1,3,sbm_r{k}');
0176 ncur=size(core1,1); r2=size(core1,2); r3=size(core1,3);
0177 core1=reshape(permute(core1,[3,1,2]),[r3*ncur,r2]);
0178 sbm_r{k-1}=core1(ind_r{k-1},:);
0179 end
0180 mx=-1.0;
0181 ind_full=zeros(1,d-1);
0182 for k=1:d-1
0183 sbm_new=sbm_l{k}*sbm_r{k}';
0184 r1=size(sbm_new,1);
0185
0186 sbm_new=abs(sbm_new(:));
0187 [mx1,is]=max(sbm_new);
0188 w=tt_ind2sub([r1,r1],is);
0189 if ( mx1 > mx )
0190 ind_full=[ind_left{k}(:,w(1))',ind_right{k}(:,w(2))'];
0191 mx=mx1;
0192 end
0193
0194 end
0195
0196
0197 return
0198 end