在Matlab中乘以两个矩阵以获得三维矩阵

时间:2013-11-30 19:42:38

标签: matlab

我在Matlab中有两个稀疏矩阵,AB, 我想计算一个三维矩阵C,以便

C(i,j,k) = A(i,j) * B(j,k)

我可以在没有循环的情况下这样做吗?

(旁边问题:此操作有名称吗?)

编辑: 似乎我的问题已被提出(仅适用于完整的矩阵): Create a 3-dim matrix from two 2-dim matrices

2 个答案:

答案 0 :(得分:1)

对于完整矩阵:

您可以使用bsxfunshiftdim执行此操作:

C = bsxfun(@times, A, shiftdim(B,-1))

解释:让A的大小为M x N且大小为N x P的B。应用shiftdim(B,-1)会得到1 x N x P数组。 bsxfun隐式复制第三维A和第一维shiftdim(B,-1),以计算所需的元素产品。

通常less efficient而不是bsxfun的另一种可能性是使用repmat在所需维度上重复数组明确:

C = repmat(A, [1 1 size(B,2)]) .* repmat(shiftdim(B,-1), [size(A,1) 1 1])

对于稀疏矩阵:

结果不能稀疏,因为不支持稀疏ND阵列。但您可以使用linear indexing使用稀疏AB进行计算:

ind1 = repmat(1:numel(A),1,size(B,2));
ind2 = repmat(1:numel(B),size(A,1),1);
ind2 = ind2(:).';
C = NaN([size(A,1),size(A,2),size(B,2)]); %// preallocate with appropriate shape
C(:) = full(A(ind1).*B(ind2)); %// need to use full if C is to be 3D

答案 1 :(得分:0)

回答您的附带问题:此操作的名称为hash join