optimization - 如何加快 Log(x+1) 在 Julia 中应用于稀疏数组的速度

标签 optimization sparse-matrix julia

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/

相关文章:

julia - 在 Julia 中将基于 1 的数组转换为基于 0 的数组

dataframe - 在 julia-0.5 中将基本数学运算符与 Julia Nullables 结合使用

c++ - 内存中的 DLL 大小和硬盘上的大小

java - Java 中的速度为什么有些代码运行得更快

c++ - 空函数是否会被不纯的表达式优化?

julia - 如何在 Julia 中将集合分成子集?

c++ - C++中void函数的重复计时

python - Scipy Sparse - 距离矩阵(Scikit 或 Scipy)

python - 在行和列中切片 scipy.sparse.lil_matrix

python - 为什么 CSR 格式在选择行方面优于 CSC 格式?