我在Matlab中有两个稀疏矩阵,A
和B
,
我想计算一个三维矩阵C
,以便
C(i,j,k) = A(i,j) * B(j,k)
我可以在没有循环的情况下这样做吗?
(旁边问题:此操作有名称吗?)
编辑: 似乎我的问题已被提出(仅适用于完整的矩阵): Create a 3-dim matrix from two 2-dim matrices
答案 0 :(得分:1)
对于完整矩阵:
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使用稀疏A
和B
进行计算:
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。