我有一个大小为m x n的2D矩阵A,其中n可能非常大(例如n>10000),以及一个大小为m x m x n的多维矩阵B。因此,针对A中的每一列i,我想计算A[:,i]'*B[:,:,i]。以下是我尝试使用Julia中的广播特性编写的代码。但是,我的代码性能相当慢。我想知道是否可以改进我的代码性能。请问是否有人有改进代码性能的想法?
using LinearAlgebra;
m = 500;
n = 20000; # this could be a very large number.
vecA = rand(m,n);
matB = rand(m,m,n);
combinedAB = Array{Array{Float64,2},2}(undef,n,1);
for ii in eachindex(combinedAB)
combinedAB[ii] = [vecA[:,ii] matB[:,:,ii]];
end
# this is the result.
res = broadcast(eAB -> dotProd(eAB), combinedAB);
function dotProd(matZ::Array{Float64,2})
return sum(broadcast(dot,matZ[:,1],matZ[:,2:end]),dims=1);
end
transpose
代替'
。感谢您的解释。 - nhavt@inbounds
、@simd
和精心设计的遍历来避免 CPU 缓存未命中。但我认为所提出的解决方案速度要么相同,要么几乎相同(即速度数量级相同),而且肯定更简单。 - Bogumił Kamiński