考虑以下情形,对于大小为[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指令。凡事可用。
实际上,你可以通过简单地解决您的问题整形变量A和B并应用乘法矩阵:
C = reshape(A, [], m)*(reshape(B, [], m).');
Run Code Online (Sandbox Code Playgroud)
基本上,将m涉及k-by-1列向量和1by - nrow向量的乘法集的结果相加等于将列的按矩阵与行的按矩阵相乘。kmmn