Julia 1.8.5中无法拼接Toeplitz矩阵问题求助
问题:Julia 1.8.5中Toeplitz矩阵与普通矩阵hcat报错
更新到Julia 1.8.5前,可正常用hcat拼接Toeplitz矩阵和普通矩阵,现在执行会触发错误,普通随机生成矩阵的拼接不受影响。
复现代码
using ToeplitzMatrices # 创建Toeplitz矩阵 B1 = Toeplitz([1, 2, 4], [1, 3, 5]) # 输出: # 3×3 Toeplitz{Int64, Vector{Int64}, Vector{Int64}}: # 1 3 5 # 2 1 3 # 4 2 1 # Toeplitz矩阵加3得到普通矩阵 B2 = B1 .+ 3 # 输出: # 3×3 Matrix{Int64}: # 4 6 8 # 5 4 6 # 7 5 4 # 尝试拼接触发错误 hcat(B1, B2)
报错信息
ERROR: CanonicalIndexError: setindex! not defined for Toeplitz{Int64, Vector{Int64}, Vector{Int64}} Stacktrace: [1] error_if_canonical_setindex(::IndexCartesian, ::Toeplitz{Int64, Vector{Int64}, Vector{Int64}}, ::Int64, ::Int64) @ Base ./abstractarray.jl:1354 [2] setindex! @ ./abstractarray.jl:1343 [inlined] [3] macro expansion @ ./multidimensional.jl:946 [inlined] [4] macro expansion @ ./cartesian.jl:64 [inlined] [5] _unsafe_setindex!(::IndexCartesian, ::Toeplitz{Int64, Vector{Int64}, Vector{Int64}}, ::Toeplitz{Int64, Vector{Int64}, Vector{Int64}}, ::Base.Slice{Base.OneTo{Int64}}, ::UnitRange{Int64}) @ Base ./multidimensional.jl:941 [6] _setindex! @ ./multidimensional.jl:930 [inlined] [7] setindex! @ ./abstractarray.jl:1344 [inlined] [8] _typed_hcat(#unused#::Type{Int64}, A::Tuple{Toeplitz{Int64, Vector{Int64}, Vector{Int64}}, Matrix{Int64}}) @ Base ./abstractarray.jl:1618 [9] typed_hcat @ ./abstractarray.jl:1586 [inlined] [10] hcat(::Toeplitz{Int64, Vector{Int64}, Vector{Int64}}, ::Matrix{Int64}) @ Base ./abstractarray.jl:1589 [11] top-level scope @ REPL[4]:1
期望输出
1 3 5 11 13 15 2 1 3 12 11 13 4 2 1 14 12 11
解决方案
报错核心是Toeplitz属于特殊不可变数组类型,未实现setindex!方法,而Julia 1.8.5的hcat逻辑尝试直接修改原Toeplitz矩阵完成拼接,导致错误。
解决方式很简单:先将Toeplitz矩阵转换为普通矩阵,再执行拼接操作:
hcat(Matrix(B1), B2)
若需要保留特殊矩阵结构的原生拼接支持,可向ToeplitzMatrices包提交issue,请求添加hcat的重载实现,避免直接操作原矩阵。
内容的提问来源于stack exchange,提问作者TD TL
相关产品推荐
相关产品推荐

