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

hac*_*dev 2 octave

考虑以下情形,对于大小为[k,1,m]的A和大小为[1,n,m]的B,如何获得与以下结果相同的结果:

C = sum(A .* B, 3);
Run Code Online (Sandbox Code Playgroud)

没有扩大

A .* B
Run Code Online (Sandbox Code Playgroud)

因为那会占用太多内存。类似于以下循环,但本机地:

C = zeros(k,n);
for idx = 1:m
    C += A(:,1,idx) * B(1,:,idx);
end
Run Code Online (Sandbox Code Playgroud)

我想我也可以问是否有像bsxfun这样的函数具有类似“ reduce”的行为?就像是:

C = bsxfun_accumulate(@(a, b) a * b, A, B);
Run Code Online (Sandbox Code Playgroud)

注意:本机是指cs / cuda代码路径,opencl代码路径,x86-sse或普通x86指令。凡事可用。

gno*_*ice 6

实际上,你可以通过简单地解决您的问题整形变量AB并应用乘法矩阵

C = reshape(A, [], m)*(reshape(B, [], m).');
Run Code Online (Sandbox Code Playgroud)

基本上,将m涉及k-by-1列向量和1by - nrow向量的乘法集的结果相加等于将列的按矩阵与行的按矩阵相乘。kmmn