** 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的切片順序完全反過來,圖片描述如下:
假如以下為原始張量:
轉(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ì)**
首先說明一下 squeeze 操作及 twist, 簡(jiǎn)單一張圖就可以描述:
這都可以相等。。very amazing 啊 ,光證明出來咋能不驗(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展開操作
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
% 用于張量展開為循環(huán)矩陣
% 獲取張量大小
[l,p,n]=size(A);dimA=[l,p,n];
% 對(duì)A進(jìn)行unfold展開操作
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瀏覽量
19998 -
交換矩陣
+關(guān)注
關(guān)注
0文章
4瀏覽量
5462
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
MATLAB操作符和特殊字符
求助,實(shí)現(xiàn)一下矩陣的轉(zhuǎn)置函數(shù)
【MATLAB使用心得匯總——Tips 1-5 】
ADC采樣不精確,飄的離譜
labview中調(diào)用matlab腳本為什么會(huì)提示matlab服務(wù)器未安裝matlab服務(wù)器,但是我的matlab已經(jīng)打開,這是什么問題
轉(zhuǎn)置型FIR濾波器的實(shí)現(xiàn)
矩陣轉(zhuǎn)置中的問題
MATLAB簡(jiǎn)介及MATLAB的基本操作
華為 Mate 9 三周體驗(yàn)評(píng)測(cè):4000mAh續(xù)航久的離譜!
MATLAB基礎(chǔ)知識(shí)MATLAB的簡(jiǎn)介,編程環(huán)境和基本操作的詳細(xì)概述
![<b class='flag-5'>MATLAB</b>基礎(chǔ)知識(shí)<b class='flag-5'>MATLAB</b>的簡(jiǎn)介,編程環(huán)境和基本<b class='flag-5'>操作</b>的詳細(xì)概述](https://file.elecfans.com/web1/M00/52/34/o4YBAFsR_2KARKWzAAAR-4vu1lM877.png)
如何使用基于轉(zhuǎn)置卷積操作改進(jìn)進(jìn)行單階段多邊框目標(biāo)檢測(cè)方法
![如何使用基于<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>置</b>卷積<b class='flag-5'>操作</b>改進(jìn)進(jìn)行單階段多邊框目標(biāo)檢測(cè)方法](https://file.elecfans.com/web1/M00/7D/E4/o4YBAFwQoGCAVwyIAABOYSjMBZQ092.png)
一篇文章搞定CNN轉(zhuǎn)置卷積
PyTorch教程14.10之轉(zhuǎn)置卷積
![PyTorch教程14.10之<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>置</b>卷積](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論