我使用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)
我希望我的代码以这种方式工作。也就是说,大部分代码是相同的,通过使用正确的迭代器,代码可以针对两种情况(稀疏和法向量)进行优化。
我的问题是:是否有任何迭代器可以实现我想要实现的目标?在这种情况下,迭代器返回值,但在索引上的迭代器将工作于。
欢呼,迪伦
我想你几乎得到了你想要的东西。即,将AbstractVector
和SparseVector
改为AbstractArray
和AbstractSparseArray
。但也许我遗漏了什么?参见下面的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