【问题标题】:Generalized Matrix Product广义矩阵积
【发布时间】:2011-12-24 20:50:20
【问题描述】:

我对 MATLAB 还很陌生。 M x K 矩阵乘以 K x N 矩阵的正态矩阵乘法 -- C = A * B -- 具有 c_ij = sum(a_ik * b_kj, k = 1:K)。如果我希望它改为c_ij = sum(op(a_ik, b_kj), k = 1:K) 用于一些简单的二进制操作op 怎么办?有没有什么好的方法可以在 MATLAB(或者甚至是内置函数)中对其进行矢量化?

编辑:这是目前我能做的最好的。

% A is M x K, B is K x N
% op is min
C = zeros(M, N);
for i = 1:M:
    C(i, :) = sum(bsxfun(@min, A(i, :)', B));
end

【问题讨论】:

  • 这里列出的任何解决方案对您有用吗?

标签: matlab vectorization matrix-multiplication bsxfun


【解决方案1】:

这篇文章中列出的是一种矢量化方法,它与bsxfun 保持一致,通过使用permute 创建bsxfun 需要的单例维度,让singleton-expansion 完成工作,从而基本上替换原始循环中的循环邮政。请注意,bsxfun 是一个内存消耗量大的实现,所以只有在它被拉伸得太远时才能期待加速。这是最终的解决方案代码 -

op = @min;   %// Edit this with your own function/ operation
C = sum(bsxfun(op, permute(A,[1 3 2]),permute(B,[3 2 1])),3)

注意 - 上述解决方案的灵感来自 Removing four nested loops in Matlab

【讨论】:

  • bsxfun 的文档并未表明它需要大量内存。你是如何确定这个事实的?我不知道 bsxfun 的这个问题。
  • @John Well bsxfun 的定义在内部扩展了单例维度,然后进行元素操作。这种扩展本质上需要内存上如此大的连续区域。这种对连续内存的搜索意味着更多的运行时间。在运行基于 bsxfun 的代码时,也可以通过观察系统监视器来确认这种“内存不足”的性质。但是使用bsxfun 的好处是,一旦分配了内存,操作就会以超快的方式完成。希望这有点道理!
【解决方案2】:

如果操作员可以逐个元素操作(如.*):

if(size(A,2)~=size(B,1))
    error(blah, blah, blah...);
end

C = zeros(size(A,1),size(B,2));
for i = 1:size(A,1)
    for j = 1:size(B,2)
        C(i,j) = sum(binaryOp(A(i,:)',B(:,j)));
    end
end

【讨论】:

  • 我实际上有一种方法可以通过一个 for 循环(使用 bsxfun)来完成。我想知道是否有一种纯矢量化的方式来做到这一点。
  • 我在原帖中添加了我当前的算法。
【解决方案3】:

您总是可以自己编写循环:

A = rand(2,3);
B = rand(3,4);

op = @times;            %# use your own function here
C = zeros(size(A,1),size(B,2));
for i=1:size(A,1)
    for j=1:size(B,2)
        for k=1:size(A,2)
            C(i,j) = C(i,j) + op(A(i,k),B(k,j));
        end
    end
end

isequal(C,A*B)

【讨论】:

    【解决方案4】:

    根据您的具体需求,您也许可以在 3D 中使用 bsxfun 来欺骗二元运算符。有关更多信息,请参阅此答案:https://stackoverflow.com/a/23808285/1121352 另一种选择是将 cellfun 与自定义函数一起使用: http://matlabgeeks.com/tips-tutorials/computation-using-cellfun/

    【讨论】:

    • 感谢您关注这个问题!
    • @Divakar 感谢您的精彩回答!如果您对另一个类似的挑战感兴趣,我已经发布了一个关于广义矩阵乘法的问题,目标是进一步优化:stackoverflow.com/questions/24245225/…
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多