** PART.0 長相離譜的張量轉置**
注:此轉置操作與 t-product 積相對應,在其他類型張量運算中的轉置操作可能有不同的定義方式,請注意區分。
簡單描述一下:
我們把三維張量每一個frontal slices(面向我們的切片),進行轉置,然后將序號2到n的切片順序完全反過來,圖片描述如下:
假如以下為原始張量:
轉置完成后:
那么。。。為什么會有如此的操作呢,其實這都是為了之后的張量inside product做準備(不叫做內積是因為有某些性質不符合內積的定義),和向量內積很像,張量內積也需要其中某個張量轉置之后和另一個張量做 t-product 積,既然是做 t-product 積,就要遷就于 t-product 積的某些性質。
這里再重提一下 t-product 積的定義:
** PART.1 轉置的特殊性質**
首先說明一下 squeeze 操作及 twist, 簡單一張圖就可以描述:
這都可以相等。。very amazing 啊 ,光證明出來咋能不驗證呢?
** PART.2 MATLAB實現**
我們編寫如下 MATLAB 程序(引用的子函數放到最后):
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
左右兩邊運行結果一致,非常完美,另外各個子函數如下:
t-product
function C=t_prod(A,B)
% @author:slandarer
% 用于進行張量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
% 對A,B進行unfold展開操作
ufold_A=reshape(permute(A,[2,1,3]),dimA(2),[])';
ufold_B=reshape(permute(B,[2,1,3]),dimB(2),[])';
% 對A構建循環矩陣
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
張量轉置
function AT=t_T(A)
% @author:slandarer
% 應對與張量t-product積的轉置
[l,m,n]=size(A);
AT=zeros([m,l,n]);
% fronral slices轉置
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 翻轉
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
% 用于張量展開為循環矩陣
% 獲取張量大小
[l,p,n]=size(A);dimA=[l,p,n];
% 對A進行unfold展開操作
ufold_A=reshape(permute(A,[2,1,3]),dimA(2),[])';
% 對A構建循環矩陣
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仿真
+關注
關注
4文章
176瀏覽量
19945 -
交換矩陣
+關注
關注
0文章
4瀏覽量
5456
發布評論請先 登錄
相關推薦
評論