【问题标题】:How to iterate over the non-zero values of a sparse array如何迭代稀疏数组的非零值
【发布时间】:2018-10-02 07:14:09
【问题描述】:

我在 Julia 中有一个稀疏数组,并且想遍历它的非零条目。这样做的好方法是什么?

到目前为止,我有:

using SparseArrays

a = sprandn(20,20,0.3)

for (x,y,v) in a
  print(x,y,v)
end

【问题讨论】:

  • 这真的取决于你想做什么。你需要值的索引吗?如果没有,您可以遍历nonzeros(A)
  • @fredrikekre:我需要索引。在我的用例中,这些值本身并不重要。

标签: julia sparse-matrix


【解决方案1】:

findnz 函数返回一个元组,其中包含稀疏矩阵的 x、y 和值分量的数组。也就是说,

findnz(a) gives ([x1, x2, x3, ...], [y1, y2, y3, ...], [v1, v2, v3, ...])

你可以像迭代器一样使用它:

for (x,y,v) in zip(findnz(a)...)
  println(x,' ',y,' ',v)
end

【讨论】:

  • 这非常漂亮和紧凑;但对于一个简单的循环(例如添加所有矩阵条目),它比@Kristoffer Carlsson 的解决方案慢 10 倍
【解决方案2】:

这是一个直接的方法

using SparseArrays

function print_nz(A)
    for col in 1:size(A, 2)
        for r in nzrange(A, col)
            println(rowvals(A)[r], ' ', col, ' ',  nonzeros(A)[r])
        end
    end
end

及其使用示例:

julia> A = [1 2 1
            0 0 1
            3 0 0];

julia> print_nz(sparse(A))
1 1 1
3 1 3
1 2 2
1 3 1
2 3 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多