参考文献:Tensor Robust Principal Component Analysis with a New Tensor Nuclear Norm
首先是文章2.3节中 t-product 的定义:
块循环矩阵:
参考知乎博主的例子及代码:(t-product与t-QR分解,另一篇傅里叶对角化也很值得学习)
Matlab
% A=zeros([3,2,2]);
% B=zeros([2,1,2]);
%
% A(:,:,1)=[1 0;0 2;-1 3];
% A(:,:,2)=[-2 1;-2 7;0 -1];
%
% B(:,:,1)=[3;-1];
% B(:,:,2)=[-2;-3];
A=rand(3,2,5);
B=rand(2,1,5);
C=t_product(A,B)
function C=t_product(A,B)
% @author:slandarer
% 获取张量大小
[l,p,n]=size(A);dimA=[l,p,n];
[p,m,n]=size(B);dimB=[p,m,n];
dimC=[l,m,n];
% 对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]);
CC = fft(C, [], 3) % 观察,张量C后n3-1个切片呈共轭对称
end