请考虑以下情形,对于大小为[k,1,m]的A和大小为[1,n,m]的B,如何获得与以下相同的结果:
C = sum(A .* B, 3);
不扩展
A .* B
因为这会占用过多的内存。 类似于以下循环,但本来就是这样:
C = zeros(k,n);
for idx = 1:m
C += A(:,1,idx) * B(1,:,idx);
end
我想我也可以问是否有像bsxfun这样的函数具有类似“ reduce”的行为? 像这样:
C = bsxfun_accumulate(@(a, b) a * b, A, B);
注意:本机的意思是CS / CUDA代码路径,或OpenCL代码路径,或x86-sse,或普通x86指令。一切可用。
答案 0 :(得分:6)
您实际上可以通过简单地reshaping变量B
和C = reshape(A, [], m)*(reshape(B, [], m).');
并应用matrix multiply来解决问题:
m
基本上,将k
个乘以n
×1列向量和1×{k
行向量的乘法集的总和等于乘以{{1 }}行m
矩阵和行m
n
矩阵。