速度不会慢8倍,而速度会快 8000x 。原因是因为Julia使用多个分派来使用专门的算法,这些算法可以利用矩阵和向量的稀疏存储来完全避免在已知为零的数组部分上工作。您可以看到正在使用@which
调用哪种算法:
julia> @which A*v
*(A::SparseArrays.AbstractSparseMatrixCSC,x::AbstractSparseArray{Tv,Ti,1} where Ti where Tv) in SparseArrays at /Users/mbauman/Julia/master/usr/share/julia/stdlib/v1.4/SparseArrays/src/sparsevector.jl:1722
julia> @which B*v
*(A::AbstractArray{T,2},x::AbstractArray{S,1}) where {T,S} in LinearAlgebra at /Users/mbauman/Julia/master/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/matmul.jl:50
前者使用高度专业化的稀疏实现,而后者使用稍微更通用的接口,该接口也可以支持视图。现在,理想情况下,我们将检测到诸如view(A,:,:)
这样的琐碎情况,并且将它们专门化为有效的相同情况,但是请注意,通常情况下,视图可能无法保留矩阵的稀疏性和结构:
julia> view(A,ones(Int,1000),1000))
1000×1000 view(::SparseMatrixCSC{Float64,Int64},[1,1,1 … 1,1],1]) with eltype Float64:
0.306159 0.306159 0.306159 0.306159 … 0.306159 0.306159 0.306159
0.306159 0.306159 0.306159 0.306159 0.306159 0.306159 0.306159
0.306159 0.306159 0.306159 0.306159 0.306159 0.306159 0.306159
⋮ ⋱
0.306159 0.306159 0.306159 0.306159 0.306159 0.306159 0.306159
0.306159 0.306159 0.306159 0.306159 0.306159 0.306159 0.306159
0.306159 0.306159 0.306159 0.306159 … 0.306159 0.306159 0.306159
本文链接:https://www.f2er.com/3164447.html