填充稀疏矩阵的最佳方法

Best way to fill a sparse matrix

填充稀疏矩阵的最有效方法是什么?我知道稀疏矩阵是 CSC,所以我希望像

这样逐列填充它们会很快
using SparseArrays

M = 100
N = 1000

sparr = spzeros(Float64, M, N)

for n = 1:N

  # do some math here

  idx = <<boolean index array of nonzero elements in the nth column>>
  vals =  <<values of nonzero elements in the nth column>>

  sparr[idx, n] = vals

end

但是,我发现这对 N 的缩放比例很差。有没有更好的方法来填充数组?或许,我不应该为填充数组而烦恼,而是以不同的方式初始化矩阵?

你可以直接sparse(I, J, V, M, N):

julia> using SparseArrays

julia> M = 100;

julia> N = 1000;

julia> nz = 2000; # number of nonzeros

julia> I = rand(1:M, nz); # dummy I indices

julia> J = rand(1:N, nz); # dummy J indices

julia> V = randn(nz); # dummy matrix values

julia> sparse(I, J, V, M, N)
100×1000 SparseMatrixCSC{Float64, Int64} with 1982 stored entries:
⣻⣿⣿⣿⣿⡿⣾⣿⣿⣿⣿⣿⣿⣷⣾⣽⣿⢿⢿⣿⣿⣿⢿⣿⣾⣿⣽⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿
⣼⣿⣿⡿⣿⣿⡽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⡿⣿⣿⣿⡿⣿⡿⣯⢿⣿⠾⣿⣿⡿⢿⣿⣻⡿⣾

它应该随大小适当缩放。对于更专业的使用,您可以直接构造 SparseMatrixCSC 对象。


编辑:

请注意,如果您必须坚持为列索引和值提供 for-loop 的伪代码,您可以简单地连接它们并创建 IJ,和 V:

I = Int[]
J = Int[]
V = Float64[]

for n = 1:N

  # do some math here

  idx = <<boolean index array of nonzero elements in the nth column>>
  vals =  <<values of nonzero elements in the nth column>>

  I = [I; idx]
  J = [J; fill(n, length(I))]
  V = [V; vals]

end

但我认为那样会更慢。