【问题标题】:Multiply two matrices in Matlab to obtain 3-dimensional matrixMatlab中两个矩阵相乘得到3维矩阵
【发布时间】:2013-11-30 19:42:38
【问题描述】:

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

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

我可以在没有循环的情况下执行此操作吗?

(附带问题:这个操作有名称吗?)

编辑: 似乎我的问题已经被问到(仅针对完整矩阵): Create a 3-dim matrix from two 2-dim matrices

【问题讨论】:

  • 我很好奇您需要哈希联接的上下文。

标签: matlab


【解决方案1】:

对于完整矩阵:

您可以使用bsxfunshiftdim

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

解释:让A 的大小为 M x N,B 的大小为 N x P。应用 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

【讨论】:

  • 是否可以使用bsxfunshiftdim 修改版本以适用于稀疏矩阵?
  • 我没想到...不,它似乎不适用于稀疏矩阵。你需要类似bsxfun(@times, full(A), shiftdim(full(B),-1))
  • 也许我问这个问题时有点太快了。似乎 Matlab 默认情况下甚至不支持 3 维稀疏矩阵。我不得不承认,目前我正在使用类似 A(i+m*(j-1),k) = B(i,j) * C(j,k) 的东西,并且乐观地假设能够将其更改为 A(i,j,k)
  • @Matthias009 查看更新的答案。您可以对稀疏的 A 和 B 进行计算,但正如您所说,结果必须是完整的
  • 线性索引解决方案看起来很有趣,可能这就是我要走的路。 (只是以某种方式直接与C = A(ind1).*B(idnd2) 合作)。感谢您的帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多