如何从向量生成对角矩阵

Vin*_*nod 9 matrix diagonal julia

using LinearAlgebra;
        a = rand(4,1);
        B = diagm(a);
        C  = Diagonal(a);
Run Code Online (Sandbox Code Playgroud)

上面的代码在创建对角矩阵时会导致错误/(不是有意的)。

如果a = [1 2 3 4]

我需要一个像这样的矩阵:

D = [1 0 0 0;0 2 0 0;0 0 3 0;0 0 0 4].
Run Code Online (Sandbox Code Playgroud)

C = 对角线(a) 创建 C = [1]

B = 图(a);给出错误消息:

错误消息:错误:MethodError:没有方法匹配 diagm(::Matrix{Float64})

您可能在需要 1d 列向量的情况下使用了 2d 行向量。请注意 1d 列向量 [1,2,3] 和 2d 行向量 [1 2 3] 之间的区别。您可以使用 vec() 函数转换为列向量。最接近的候选者是:diagm(::Pair{var"#s832", var"#s831"} where {var"#s832"<:Integer, var"#s831"<:(AbstractVector{T} where T)}。 ..) 在 C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\dense.jl:279 diagm(::Integer, ::Integer, ::Pair{ var"#s832", var"#s831"} where {var"#s832"<:Integer, var"#s831"<:(AbstractVector{T} where T)}...) 在 C:\buildbot\worker \package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\dense.jl:280 diagm(::AbstractVector{T} where T) 位于 C:\buildbot\worker\package_win64\build\usr \share\julia\stdlib\v1.6\LinearAlgebra\src\dense.jl:329 ... Stacktrace: [1] 顶级范围 @ REPL[16]:1

Bil*_*ill 10

我认为问题是你的a矩阵。

\n

尝试这个:

\n
a = [1,2,3,4]  # 4-element Vector{Int64}\nC = Diagonal(a)\n4\xc3\x974 Diagonal{Int64, Vector{Int64}}:\n 1  \xe2\x8b\x85  \xe2\x8b\x85  \xe2\x8b\x85\n \xe2\x8b\x85  2  \xe2\x8b\x85  \xe2\x8b\x85\n \xe2\x8b\x85  \xe2\x8b\x85  3  \xe2\x8b\x85\n \xe2\x8b\x85  \xe2\x8b\x85  \xe2\x8b\x85  4\n
Run Code Online (Sandbox Code Playgroud)\n

或者,创建一个真正的对角矩阵:

\n
M = diagm(a)\n4\xc3\x974 Matrix{Int64}:\n 1  0  0  0\n 0  2  0  0\n 0  0  3  0\n 0  0  0  4\n
Run Code Online (Sandbox Code Playgroud)\n

  • 值得评论的是,@Bill 的第一个选项并未具体化为“矩阵”,因此对其进行线性代数运算会更快(只要您坚持使用具有“对角线”参数的特定实现的函数) (3认同)