在 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}
这是为什么?显然,I
是 UniformScaling{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;
我正在创建一个单位稀疏矩阵,因为我想修改这个矩阵的一些条目:
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}
这是为什么?显然,I
是 UniformScaling{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;