我读过这个post,我也有一个类似的问题。我想多次就地更新稀疏矩阵,在我看来,SparseArrays.sparse!是我最好的选择。但是,我不太理解文档,它说我可以打电话给
sparse!(I, J, V, csrrowptr, csrcolval, csrnzval, I, J, V)我的问题是:
第一组I, J, V
I, J, V
A = sparse(I,J,V),我想就地更新A。如何获得sparse!
?默认情况下,A有CSC格式,而不是CSR。
谢谢。
发布于 2022-12-01 08:11:27
在查看了文档之后,它肯定感觉到(而且是) SparseArrays的包内部功能。在任何情况下,根据你的问题(不按顺序):
Q4 (最简单的)在REPL中执行@edit sparse([1,2,3],[1,2,3],[5,6,7]),并在编辑的文件中搜索sparse!,这将显示sparse如何在内部使用sparse!。
Q1第一个I, J, V是输入,给出了通常的列索引、行索引和值。注意,这些不是结果矩阵的内部CSC存储向量。
Q2第二个I, J, V是作为内部CSC存储向量的稀疏矩阵中使用的数组。由于在sparse!调用后不需要输入,所以可以重复使用输入向量和分配内部CSC向量( I, J, K以外的其他向量可以作为输出传递,特别是当输入向量内存太少而无法容纳CSC表示时)。
Q3获取sparse!内部创建的CSR表示很容易--它们位于作为csrrowptr, csrcolval, csrnzval传递的向量中。向量需要有足够的内存,并由sparse!填充。
sparse!的全部目的是不进行任何分配/释放。内存管理由“父”接口完成(本例中为sparse)。这允许在内存已经分配或从另一个变量中回收时直接不分配处理。
这需要一些修改,但下面是sparse!使用的演示:
julia> I = sizehint!([1,2,3,1], 5)
4-element Vector{Int64}:
1
2
3
1
julia> J = sizehint!([3, 2, 1, 2], 5)
4-element Vector{Int64}:
3
2
1
2
julia> V = sizehint!([6,7,8,9],5)
4-element Vector{Int64}:
6
7
8
9现在为sparse!设置工作内存
julia> my_klasttouch = Vector{Int}(undef, 10);
julia> my_csrrowptr = Vector{Int}(undef, 10);
julia> my_csrcolval = Vector{Int}(undef, 10);
julia> my_csrnzval = Vector{Int}(undef, 10);最后:
julia> M = SparseArrays.sparse!(
I, J, V, 3, 3, +,
my_klasttouch, my_csrrowptr, my_csrcolval, my_csrnzval,
I, J, V
)
3×3 SparseMatrixCSC{Int64, Int64} with 4 stored entries:
⋅ 9 6
⋅ 7 ⋅
8 ⋅ ⋅要查看输入内存如何成为返回对象的一部分:
julia> M.colptr # this is from returned object
4-element Vector{Int64}:
1
2
4
5
julia> I
4-element Vector{Int64}:
1
2
4
5注意,I和M.colpotr使用相同的内存。
鉴于以上所述,在使用此函数之前,我建议仔细检查实现代码并仔细理解算法。
https://stackoverflow.com/questions/74636966
复制相似问题