八度:如何在不扩展A。* B的情况下求和(A。* B,3)?

时间:2019-03-27 16:43:51

标签: octave

请考虑以下情形,对于大小为[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指令。一切可用。

1 个答案:

答案 0 :(得分:6)

您实际上可以通过简单地reshaping变量BC = reshape(A, [], m)*(reshape(B, [], m).'); 并应用matrix multiply来解决问题:

m

基本上,将k个乘以n×1列向量和1×{k行向量的乘法集的总和等于乘以{{1 }}行m矩阵和行m n矩阵。