我对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
答案 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/