在 julia sparse 中修改稀疏单位矩阵

Modify sparse identity matrix in julia sparse

我正在创建一个单位稀疏矩阵,因为我想修改这个矩阵的一些条目:

Is = copy(sparse(I, N^2, N^2))

但是,我得到了错误(例如 Is[1,3] = -1

ERROR: LoadError: InexactError: Bool(-1.0)

有什么方法可以修改 Is?我不想 运行 两个大小为 N 的循环,因为这个参数非常大。

示例:

julia> using SparseArrays, LinearAlgebra

julia> Is = copy(sparse(I, N^2, N^2));

julia> Is[3, 5] = -1.0;
ERROR: InexactError: Bool(-1.0)
Stacktrace:
 [1] Bool
   @ ./float.jl:158 [inlined]
 [2] convert
   @ ./number.jl:7 [inlined]
 [3] _setindex_scalar!(A::SparseMatrixCSC{Bool, Int64}, _v::Float64, _i::Int64, _j::Int64)
   @ SparseArrays ~/Desktop/Julia/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:2670
 [4] setindex!(A::SparseMatrixCSC{Bool, Int64}, _v::Float64, _i::Int64, _j::Int64)
   @ SparseArrays ~/Desktop/Julia/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:2667
 [5] top-level scope
   @ REPL[11]:1

看起来 Is 应该包含布尔值,因此 Julia 尝试将 -1.0 转换为 Bool 并失败。实际上,Is 包含布尔值:

julia> typeof(Is)
SparseMatrixCSC{Bool, Int64}

这是为什么?显然,IUniformScaling{Bool},因此 I 是布尔值的单位矩阵。您可以将它乘以 1.0 得到浮点数:

julia> 1.0*I
UniformScaling{Float64}
1.0*I

然后创建新矩阵:

julia> Is = copy(sparse(1.0*I, N^2, N^2));

julia> eltype(Is)
Float64

julia> Is[3,5] = -1.0;