very amazing啊,這說(shuō)明什么,這說(shuō)明我們想要實(shí)現(xiàn) t-product積 不用費(fèi)勁的去搞循環(huán)矩陣,也不用去搞什么分塊展開(kāi)再折疊,我們要做的只是, 傅立葉變換--相乘--傅立葉逆變換 ?。?!
** PART.1 流程講解**
原本的t-QR分解流程:
** PART.2 MATLAB實(shí)現(xiàn)**
原始版本t-product
function C=t_prod(A,B)
% @author:slandarer
% 用于進(jìn)行張量t-product積
% A*B=fold(bcirc(A)·unfold(B))
% 獲取張量大小
[l,p,n]=size(A);dimA=[l,p,n];
[p,m,n]=size(B);dimB=[p,m,n];
dimC=[l,m,n];
if dimA(2)~=dimB(1) || dimA(3)~=dimB(3)
error('Inner tensor dimensions must agree.');
end
% 對(duì)A,B進(jìn)行unfold展開(kāi)操作
ufold_A=reshape(permute(A,[2,1,3]),dimA(2),[])';
ufold_B=reshape(permute(B,[2,1,3]),dimB(2),[])';
% 對(duì)A構(gòu)建循環(huán)矩陣
bcirc_A=zeros([l*n,p*n]);
for i=1:n
bcirc_A(:,(1:p)+(i-1)*p)=circshift(ufold_A,l*(i-1),1);
end
% bcirc(A)·unfold(B)
AB=bcirc_A*ufold_B;
% 還原張量維度
C=ipermute(reshape(AB',dimC([2,1,3])),[2,1,3]);
end
fft版本t-product
function C=t_prod_fft(A,B)
% @author:slandarer
% 基于快速傅立葉變換的張量t-product積
if size(A,2)~=size(B,1) || size(A,3)~=size(B,3)
error('Inner tensor dimensions must agree.');
end
fftA=fft(A,[],3);
fftB=fft(B,[],3);
fftC=zeros([size(A,1),size(B,2),size(A,3)]);
for i=1:size(A,3)
fftC(:,:,i)=fftA(:,:,i)*fftB(:,:,i);
end
C=ifft(fftC,[],3);
end
比較測(cè)試
% test t-product
addpath('.t_product')
A=zeros(2,3,3);
A(:,:,1)=[1 2 3; 3 4 5];
A(:,:,2)=[5 6 7; 7 8 9];
A(:,:,3)=[9 10 11;11 12 13];
B=zeros(3,2,3);
B(:,:,1)=[1 2; 3 4; 5 6];
B(:,:,2)=[5 6; 7 8; 9 10];
B(:,:,3)=[9 10;11 12;13 14];
tic
C1=t_prod(A,B)
toc
tic
C2=t_prod_fft(A,B)
toc
C1(:,:,1) =
438 492
564 636
C1(:,:,2) =
438 492
564 636
C1(:,:,3) =
294 348
420 492
歷時(shí) 0.005764 秒。
C2(:,:,1) =
438 492
564 636
C2(:,:,2) =
438 492
564 636
C2(:,:,3) =
294 348
420 492
歷時(shí) 0.001014 秒。
可以發(fā)現(xiàn)結(jié)果完全相同,而fft版本代碼更簡(jiǎn)短,而且因?yàn)槭∪チ搜h(huán)矩陣創(chuàng)建等操作,運(yùn)行速度也相較于原始版本更快。
-
比較器
+關(guān)注
關(guān)注
14文章
1614瀏覽量
106834 -
FFT
+關(guān)注
關(guān)注
15文章
430瀏覽量
59023 -
MATLAB仿真
+關(guān)注
關(guān)注
4文章
175瀏覽量
19841 -
傅立葉變換
+關(guān)注
關(guān)注
3文章
99瀏覽量
32294
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論