8

我对 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
4

4 回答 4

2

这篇文章中列出了一种矢量化方法,该方法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)

注意 - 上述解决方案的灵感来自于在 Matlab 中移除四个嵌套循环

于 2014-06-14T17:14:18.807 回答
1

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

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
于 2011-11-09T00:12:13.357 回答
0

您始终可以自己编写循环:

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)
于 2011-11-08T23:41:40.067 回答
0

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

于 2014-06-14T16:10:30.653 回答