填充稀疏矩阵的最佳方法
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 的伪代码,您可以简单地连接它们并创建 I
、J
,和 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
但我认为那样会更慢。
填充稀疏矩阵的最有效方法是什么?我知道稀疏矩阵是 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 的伪代码,您可以简单地连接它们并创建 I
、J
,和 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
但我认为那样会更慢。