** PART.0 長(zhǎng)相離譜的張量轉(zhuǎn)置**
注:此轉(zhuǎn)置操作與 t-product 積相對(duì)應(yīng),在其他類型張量運(yùn)算中的轉(zhuǎn)置操作可能有不同的定義方式,請(qǐng)注意區(qū)分。
簡(jiǎn)單描述一下:
我們把三維張量每一個(gè)frontal slices(面向我們的切片),進(jìn)行轉(zhuǎn)置,然后將序號(hào)2到n的切片順序完全反過(guò)來(lái),圖片描述如下:
假如以下為原始張量:
轉(zhuǎn)置完成后:
那么。。。為什么會(huì)有如此的操作呢,其實(shí)這都是為了之后的張量inside product做準(zhǔn)備(不叫做內(nèi)積是因?yàn)橛心承┬再|(zhì)不符合內(nèi)積的定義),和向量?jī)?nèi)積很像,張量?jī)?nèi)積也需要其中某個(gè)張量轉(zhuǎn)置之后和另一個(gè)張量做 t-product 積,既然是做 t-product 積,就要遷就于 t-product 積的某些性質(zhì)。
這里再重提一下 t-product 積的定義:
** PART.1 轉(zhuǎn)置的特殊性質(zhì)**
首先說(shuō)明一下 squeeze 操作及 twist, 簡(jiǎn)單一張圖就可以描述:
這都可以相等。。very amazing 啊 ,光證明出來(lái)咋能不驗(yàn)證呢?
** PART.2 MATLAB實(shí)現(xiàn)**
我們編寫如下 MATLAB 程序(引用的子函數(shù)放到最后):
X=zeros([2,1,3]);
X(:,:,1)=[1;2];
X(:,:,2)=[3;4];
X(:,:,3)=[5;6];
c=zeros([1,1,3]);
c(:)=[1,2,3];
squeeze(t_prod(X,c))
squeeze(X)*bcirc(t_T(c))
ans =
20 20 14
26 26 20
ans =
20 20 14
26 26 20
左右兩邊運(yùn)行結(jié)果一致,非常完美,另外各個(gè)子函數(shù)如下:
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
張量轉(zhuǎn)置
function AT=t_T(A)
% @author:slandarer
% 應(yīng)對(duì)與張量t-product積的轉(zhuǎn)置
[l,m,n]=size(A);
AT=zeros([m,l,n]);
% fronral slices轉(zhuǎn)置
for i=1:size(A,3)
AT(:,:,i)=A(:,:,i)';
end
% 徑向重排序
if size(A,3) >1
AT(:,:,1:end)=AT(:,:,[1,end:-1:2]);
end
end
squeeze
function squeezeX=squeeze(X)
% @author:slandarer
% lateral slice 翻轉(zhuǎn)
if size(X,2)==1
squeezeX=permute(X,[1,3,2]);
else
error('MyComponent:incorrectType',...
'Error input: nInput must be a lateral slice.')
end
end
bcirc
function bcircA=bcirc(A)
% @author:slandarer
% 用于張量展開(kāi)為循環(huán)矩陣
% 獲取張量大小
[l,p,n]=size(A);dimA=[l,p,n];
% 對(duì)A進(jìn)行unfold展開(kāi)操作
ufold_A=reshape(permute(A,[2,1,3]),dimA(2),[])';
% 對(duì)A構(gòu)建循環(huán)矩陣
bcircA=zeros([l*n,p*n]);
for i=1:n
bcircA(:,(1:p)+(i-1)*p)=circshift(ufold_A,l*(i-1),1);
end
end
-
MATLAB仿真
+關(guān)注
關(guān)注
4文章
176瀏覽量
19945 -
交換矩陣
+關(guān)注
關(guān)注
0文章
4瀏覽量
5455
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論