Home > tt2 > misc > axpx.m

axpx

PURPOSE ^

[y]=AXPX(A,X)

SYNOPSIS ^

function [y]=axpx(a,x)

DESCRIPTION ^

[y]=AXPX(A,X)
This is a technical function that multiplies
Matrix A by a vector and projects on X itself; 
This is for time-stepping

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [y]=axpx(a,x)
0002 %[y]=AXPX(A,X)
0003 %This is a technical function that multiplies
0004 %Matrix A by a vector and projects on X itself;
0005 %This is for time-stepping
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 %Do right-to-left orthogonalization and computation of psi
0017 %matrices
0018 corex=x.core;
0019 pos1=psx(d+1);
0020 psi=cell(d+1,1); %Psi-matrices
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    %  fprintf('i=%d \n');
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       %Convolution is now performed for psi(i) using psi(i+1) and corea, and
0038    %(new) core q
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)]); %ra,rx,ry
0044    %First, convolve over rx(i+1)
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; %pscur is now rx(i)*m(i)*ra(i+1)*ry(i+1)
0048    %Convolve over m(i),ra(i+1),n(i),ry(i+1)
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     %pscur is now rx(i)*ry(i+1)*ra(i)*n(i), it is left to convolve over
0055     %n(i)*ry(i+1)
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; %pscur is ra*rx*ry
0061     pscur=reshape(pscur,[rx(i),ra(i),ry(i)]);
0062     psi{i}=pscur;
0063    %End of psi-block
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); %Truncate unused elements
0070 %Now compute the projection itself while recomputing psi-matrices
0071  pos1=1;
0072  psy=cumsum([1;n.*ry(1:d).*ry(2:d+1)]);
0073  rm=1;
0074  %keyboard;
0075   for i=1:d
0076           %Our convolution is
0077      %ps1(ra(i),rx(i),ry(i))*cra(ra(i),n(i),m(i),ra(i+1))
0078      %*ps2(ra(i+1),rx(i+1),ry(i+1))*crx(rx(i),m(i)*rx(i+1))->
0079      %cry(ry(i),n(i),ry(i+1)
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 %     corey(psy(i):psy(i+1)-1)=crx(:);
0085 %     y.core=corey;
0086 %          psy=cumsum([1;n.*ry(1:d).*ry(2:d+1)]);
0087 %     y.ps=psy;
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;      %cry is rx(i)*ry(i)*n(i)*m(i)*ra(i+1)
0093      %convolve over m(i),rx(i) with crx
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      %cry is ry(i)*n(i)*ra(i+1)*rx(i+1)
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      %cry0=cry; %cry0 is ry(i)*n(i)*ra(i+1)*rx(i+1), convolution over ry(i)*n(i) will bring new psi --- not true; new psi will be brought with and
0103      %orthogonalization
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        %keyboard;
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      %q=q*rm;
0116      corey(pos1:pos1+ry(i)*n(i)*ry(i+1)-1)=q(:);
0117      pos1=pos1+ry(i)*n(i)*ry(i+1);
0118      %And now --- orthogonalization! (of cry) (he-he)
0119      %Now compute "new" psi
0120      %We need to compute
0121           %cry is rx(i)*ry(i)*n(i)*m(i)*ra(i+1)
0122      %convolve over m(i),rx(i) with crx
0123      %cry0 is ry(i)*n(i)*ra(i+1)*rx(i+1);
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

Generated on Wed 08-Feb-2012 18:20:24 by m2html © 2005