广义矩阵乘积

时间:2011-11-08 22:23:38

标签: matlab vectorization matrix-multiplication bsxfun

我对MATLAB很新。 M×K矩阵乘以K×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 个答案:

答案 0 :(得分:2)

本文中列出的是一种矢量化方法,通过bsxfun根据bsxfun的需要创建单个维度,让singleton-expansion完成其工作,并使用permute。从而基本上取代原帖中的循环。请注意,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

答案 1 :(得分: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

答案 2 :(得分: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)

答案 3 :(得分:0)

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