如何从向量创建对角矩阵

9
using LinearAlgebra;
        a = rand(4,1);
        B = diagm(a);
        C  = Diagonal(a);

上述代码在创建对角矩阵时出现了错误(不是预期的结果)。
如果 a = [1 2 3 4]
我需要一个像这样的矩阵:
D = [1 0 0 0;0 2 0 0;0 0 3 0;0 0 0 4].

C = Diagonal(a)创建一个包含a元素的对角线向量C,其中a是一维列向量。
B = diagm(a);会出现错误信息:
错误消息:ERROR: MethodError: no method matching diagm(::Matrix{Float64})
您可能使用了一个二维行向量,而需要的是一维列向量。请注意一维列向量[1,2,3]和二维行向量[1 2 3]之间的区别。您可以使用vec()函数将其转换为列向量。最接近的候选项是:
diagm(::Pair{var"#s832", var"#s831"} where {var"#s832" <: Integer, var"#s831" <: (AbstractVector{T} where T)}...) at 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)}...) at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\dense.jl:280
diagm(::AbstractVector{T} where T) at C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.6\LinearAlgebra\src\dense.jl:329
... Stacktrace: [1] top-level scope @ REPL[16]:1

2
错误信息在这里实际上非常好,准确地解释了问题以及如何解决它:“您可能已经使用了一个二维行向量,而需要的是一维列向量。请注意一维列向量[1,2,3]和二维行向量[1 2 3]之间的区别。您可以使用vec()函数将其转换为列向量。” - DNF
1个回答

10

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

尝试这个:

a = [1,2,3,4]  # 4-element Vector{Int64}
C = Diagonal(a)
4×4 Diagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 ⋅  2  ⋅  ⋅
 ⋅  ⋅  3  ⋅
 ⋅  ⋅  ⋅  4

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

M = diagm(a)
4×4 Matrix{Int64}:
 1  0  0  0
 0  2  0  0
 0  0  3  0
 0  0  0  4

1
这里有一个不错的教程,详细解释了 Julia 中各种类型的对角矩阵。链接:https://web.eecs.umich.edu/~fessler/course/551/julia/tutor/03-diag.html - Bill
3
值得一提的是,@Bill 提出的第一个选项并没有成为一个“Matrix”,因此对它进行线性代数操作会更加快速(只要你坚持使用特定实现了“Diagonal”参数的函数)。 - Przemyslaw Szufel
@Bill,用Julia生产规范化邻接矩阵的最佳方法是什么? - Vass
@Vass 我不确定。这与这个问题有关还是另一个问题? - Bill
@Bill,对于生成归一化邻接矩阵来说,对角线非常关键。 - Vass
1
@Vass 如果你在网上找不到答案,我建议你考虑提出一个新问题。你总是可以参考这个问题。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接