在Julia中,稀疏矩阵仅存储非零元素。
一些函数(例如所有基数的log(x+1)
)将零映射为零,因此不需要应用于这些零元素。
(我认为我们会称之为幺半同态。)
我如何利用这个事实来加速操作?
示例代码:
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)
稍作更改,可能是因为编译非常简单。
log1p
利用了这一点。julia> @time log1p(X); 经过时间:4.81e-5 秒(分配了 93 kB)
- Andreas Noack