-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathAtwithQ.m
35 lines (33 loc) · 1.23 KB
/
AtwithQ.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function BTN=AtwithQ(ATN,QTN)
% A'*Q
% sum 2nd mode of ATN with 2nd mode of Q
BTN.n=QTN.n;
BTN.n(:,2)=ATN.n(:,3);
BTN.n(:,1)=ATN.n(:,1).*QTN.n(:,1);
BTN.n(:,4)=ATN.n(:,4).*QTN.n(:,4);
%% First core separate
tempa=reshape(ATN.core{1},ATN.n(1,2:4));
tempa=permute(tempa,[2,1,3]);
tempa=reshape(tempa,[prod(ATN.n(1,2:3)),ATN.n(1,4)]);
tempa=tempa';
tempa=reshape(tempa,[ATN.n(1,4)*ATN.n(1,3),ATN.n(1,2)]);
tempq=reshape(QTN.core{1},[QTN.n(1,2),prod(QTN.n(1,3:end))]);
B=tempa*tempq;
B=reshape(B,[ATN.n(1,4),ATN.n(1,3)*prod(QTN.n(1,3:4))]);
B=B';
BTN.core{1}=reshape(B,[ATN.n(1,3),QTN.n(1,3),QTN.n(1,4)*ATN.n(1,4)]);
for i=2:size(ATN.n,1)
tempa=reshape(ATN.core{i},ATN.n(i,:));
tempa=permute(tempa,[1,3,4,2]);
tempa=reshape(tempa,[prod(ATN.n(i,1:2))*ATN.n(i,4),ATN.n(i,3)]);
tempq=reshape(QTN.core{i},[QTN.n(i,1),prod(QTN.n(i,2:end))]);
tempq=tempq';
tempq=reshape(tempq,[QTN.n(i,2),QTN.n(i,4)*QTN.n(i,1)]);
B=tempa*tempq;
B=reshape(B,[prod(ATN.n(i,[1,3,4]))*QTN.n(i,4),QTN.n(i,1)]);
B=B';
B=reshape(B,[QTN.n(i,1)*ATN.n(i,1)*ATN.n(i,2),ATN.n(i,4),QTN.n(i,4)]);
B=permute(B,[1,3,2]);
BTN.core{i}=reshape(B,[QTN.n(i,1)*ATN.n(i,1),ATN.n(i,2),ATN.n(i,4)*QTN.n(i,4)]);
end
end