如何在Julia中有效地初始化巨大的稀疏数组?

log*_*ick 6 julia

有两种方法可以初始化NXN稀疏矩阵,该矩阵的条目将从一个/多个文本文件中读取。哪一个更快?我需要效率更高的一个,因为N很大,通常为10 ^ 6。

1)。我可以将(x,y)索引存储在数组x,y中,将条目存储在数组v中并声明

K = sparse(x,y,value);

2)。我可以宣布 K = spzeros(N)

然后读取(i,j)坐标和值v并将其插入为 K[i,j]=v;

当他们正在阅读。在稀疏数组的Julia的页面上,我没有找到任何提示。

log*_*ick 5

不要一个一个地插入值:因为稀疏矩阵中的存储需要一遍又一遍地重新分配,所以效率会非常低。

您还可以使用 BenchmarkTools.jl 来验证这一点:

julia> using SparseArrays

julia> using BenchmarkTools

julia> I = rand(1:1000, 1000); J = rand(1:1000, 1000); X = rand(1000);

julia> function fill_spzeros(I, J, X)
         x = spzeros(1000, 1000)
         @assert axes(I) == axes(J) == axes(X)
         @inbounds for i in eachindex(I)
           x[I[i], J[i]] = X[i]
         end
         x
       end
fill_spzeros (generic function with 1 method)

julia> @btime sparse($I, $J, $X);
  10.713 ?s (12 allocations: 55.80 KiB)

julia> @btime fill_spzeros($I, $J, $X);
  96.068 ?s (22 allocations: 40.83 KiB)
Run Code Online (Sandbox Code Playgroud)

原始帖子可以在这里找到