在Julia

时间:2019-06-14 12:01:06

标签: julia

我有一个尺寸为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

1 个答案:

答案 0 :(得分:4)

您这种情况够快吗?

res = [a'*b for (a, b) in zip(eachcol(vecA), eachslice(matB, dims=3))]

我没有足够的RAM可以测试您输入的值,但是考虑到我对较小数据所做的测试,它应该在3秒钟内运行。

我还假设您确实想要a的伴随词(这是您在问题中所写的内容;如果您使用的是实数,则使用'或{{1 }})

代码之间的关键区别(它隐藏在我的解决方案中,因为它更短一些)是我的解决方案不分配中间数组,而是使用视图。