Matlab中的张量收缩

Matlab中的张量收缩,matlab,matrix,vectorization,matrix-multiplication,Matlab,Matrix,Vectorization,Matrix Multiplication,可能重复: 有没有办法在Matlab中压缩高维张量 例如,假设我有两个三维数组,大小如下: size(A) == [M,N,P] size(B) == [N,Q,P] 我想分别在第二个和第一个索引上收缩A和B。换言之,我想把 a 作为一个数组的大小 > [m,n] < /c>和 b>代码>为等长数组 [n,q] < /代码>矩阵;我想将这些数组元素乘以元素(矩阵乘以矩阵),得到大小[M,Q,P] 我可以通过for循环执行此操作: assert(size(A,2) == size(B,1));

可能重复:

有没有办法在Matlab中压缩高维张量

例如,假设我有两个三维数组,大小如下:

size(A) == [M,N,P]
size(B) == [N,Q,P]
我想分别在第二个和第一个索引上收缩
A
B
。换言之,我想把<代码> a <代码>作为一个数组的大小<代码> > [m,n] < /c>和<代码> b>代码>为等长数组<代码> [n,q] < /代码>矩阵;我想将这些数组元素乘以元素(矩阵乘以矩阵),得到大小
[M,Q,P]

我可以通过for循环执行此操作:

assert(size(A,2) == size(B,1));
assert(size(A,3) == size(B,3));

M = size(A,1);
P = size(A,3);
Q = size(B,2);

C = zeros(M, Q, P);
for ii = 1:size(A,3)
    C(:,:,ii) = A(:,:,ii) * B(:,:,ii);
end
有没有一种方法可以避免for循环?(可能适用于任意维数的数组?

这里有一个解决方案(类似于之前所做的),它通过一个矩阵乘法运算计算结果,尽管它需要对矩阵进行大量操作以将其转换为所需的形状。然后,我将其与简单for循环计算进行比较(我承认这更具可读性)

请注意,上面执行的乘法比需要的要多,但有时是这样。遗憾的是,事实并非如此,因为FOR循环在这里要快得多:)

我的观点是要表明矢量化并不容易,基于循环的解决方案并不总是坏的…

可能的重复。同样相关的还有:
%# 3D matrices
A = rand(4,2,3);
B = rand(2,5,3);
[m n p] = size(A);
[n q p] = size(B);

%# single matrix-multiplication operation (computes more products than needed)
AA = reshape(permute(A,[2 1 3]), [n m*p])';      %'# cat(1,A(:,:,1),...,A(:,:,p))
BB = reshape(B, [n q*p]);                         %# cat(2,B(:,:,1),...,B(:,:,p))
CC = AA * BB;
[mp qp] = size(CC);

%# only keep "blocks" on the diagonal
yy = repmat(1:qp, [m 1]);
xx = bsxfun(@plus, repmat(1:m,[1 q])', 0:m:mp-1); %'
idx = sub2ind(size(CC), xx(:), yy(:));
CC = reshape(CC(idx), [m q p]);

%# compare against FOR-LOOP solution
C = zeros(m,q,p);
for i=1:p
    C(:,:,i) = A(:,:,i) * B(:,:,i);
end
isequal(C,CC)