我有一个尺寸为m x n的2D矩阵A
,其中n可以是一个非常大的数字(例如n> 10000),尺寸为m x m x n的多维矩阵。因此,对于i
中的每一列A
,我都想计算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
答案 0 :(得分:4)
您这种情况够快吗?
res = [a'*b for (a, b) in zip(eachcol(vecA), eachslice(matB, dims=3))]
我没有足够的RAM可以测试您输入的值,但是考虑到我对较小数据所做的测试,它应该在3秒钟内运行。
我还假设您确实想要a
的伴随词(这是您在问题中所写的内容;如果您使用的是实数,则使用'
或{{1 }})
代码之间的关键区别(它隐藏在我的解决方案中,因为它更短一些)是我的解决方案不分配中间数组,而是使用视图。