如何遍历稀疏矩阵和正规矩阵的所有非零值



我使用Julia,我想迭代矩阵的值。这个矩阵可以是普通矩阵也可以是稀疏矩阵但是我没有先验知识。我想创建一个代码,将在这两种情况下工作,并被优化为两种情况。

为简单起见,我做了一个计算向量乘以一个随机值的和的例子。我想做的实际上与此类似,但不是乘以一个随机数,而是一个需要很长时间计算的函数。

myiterator(m::SparseVector) = m.nzval
myiterator(m::AbstractVector) = m
function sumtimesrand(m)
a = 0.
for i in myiterator(m)
a += i * rand()
end
return a
end

I = [1, 4, 3, 5]; V = [1, 2, -5, 3];
Msparse = sparsevec(I,V)
M = rand(5)
sumtimesrand(Msparse)
sumtimesrand(M)

我希望我的代码以这种方式工作。也就是说,大部分代码是相同的,通过使用正确的迭代器,代码可以针对两种情况(稀疏和法向量)进行优化。

我的问题是:是否有任何迭代器可以实现我想要实现的目标?在这种情况下,迭代器返回值,但在索引上的迭代器将工作于。

欢呼,迪伦

我想你几乎得到了你想要的东西。即,将AbstractVectorSparseVector改为AbstractArrayAbstractSparseArray。但也许我遗漏了什么?参见下面的MWE:

using SparseArrays
using BenchmarkTools # to compare performance
# note the changes here to "Array":
myiterator(m::AbstractSparseArray) = m.nzval
myiterator(m::AbstractArray) = m
function sumtimesrand(m)
a = 0.
for i in myiterator(m)
a += i * rand()
end
return a
end
N = 1000
spV = sprand(N, 0.01); V = Vector(spV)
spM = sprand(N, N, 0.01); M = Matrix(spM)
@btime sumtimesrand($spV); #  0.044936 μs
@btime sumtimesrand($V);   #  3.919    μs
@btime sumtimesrand($spM); # 0.041678 ms
@btime sumtimesrand($M);   # 4.095    ms

相关内容

  • 没有找到相关文章

最新更新