如何在Julia中高效地初始化大型稀疏数组?

7
有两种方法可以初始化一个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的稀疏数组页面上没有找到有关此的提示。

你在这方面进展如何?你尝试使用系统时间语句来获取每个概念的基本工作时间了吗? - J. Murray
1个回答

6
不要逐个插入值:这样极其低效,因为稀疏矩阵的存储需要一次又一次地重新分配空间。 您也可以使用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)

原始帖子可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接