Julia 中的稀疏矩阵仅存储非零元素。
一些功能,例如log(x+1)
(在所有基地),
将零映射到零,因此不需要应用于那些零元素。
(我想我们会称之为 Monoid homomorphism 。)
我怎样才能利用这个事实来加速操作?
示例代码:
X = sprand(10^4,10^4, 10.0^-5, rand)
function naiveLog2p1(N::SparseMatrixCSC{Float64,Int64})
log2(1+N) |> sparse
end
运行:
@time naiveLog2p1(X)
输出是:
elapsed time: 2.580125482 seconds (2289 MB allocated, 6.86% gc time in 3 pauses with 0 full sweep)
第二次(这样函数应该已经被编译):
elapsed time: 2.499118888 seconds (2288 MB allocated, 8.17% gc time in 3 pauses with 0 full sweep)
变化不大,大概是因为编译起来很简单。
最佳答案
根据 Julia 手册中关于“稀疏矩阵运算”的建议,我将使用 findnz()
将稀疏矩阵转换为密集矩阵,对值进行对数运算并重建稀疏矩阵带有 sparse()
的矩阵。
function improvedLog2p1(N::SparseMatrixCSC{Float64,Int64})
I,J,V = findnz(N)
return sparse(I,J,log2(1+V))
end
@time improvedLog2p1(X)
elapsed time: 0.000553508 seconds (473288 bytes allocated)
关于optimization - 如何加快 Log(x+1) 在 Julia 中应用于稀疏数组的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687799/