【问题标题】:How to make a diagonal matrix from a vector如何从向量制作对角矩阵
【发布时间】:2021-10-18 01:32:00
【问题描述】:
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) 创建 C = [1]

B = 诊断 (a);给出错误信息:

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

您可能使用了 2d 行向量,而 1d 列向量是 必需的。注意 1d 列向量 [1,2,3] 和 2d 之间的区别 行向量 [1 2 3]。您可以使用 vec() 转换为列向量 功能。最接近的候选者是:diagm(::Pair{var"#s832", var"#s831"} where {var"#s832"<:integer var t c: diagm ::integer ::pair where ... stacktrace>

【问题讨论】:

  • 这里的错误信息其实很好,并且准确地解释了问题以及如何解决它:“您可能使用了需要 1d 列向量的 2d 行向量。注意 1d 之间的区别列向量 [1,2,3] 和 2d 行向量 [1 2 3]。您可以使用 vec() 函数转换为列向量。"

标签: matrix julia diagonal


【解决方案1】:

我认为问题在于您的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

【讨论】:

  • 很好的教程here解释了Julia中各种类型的对角矩阵。
  • 值得评论的是,@Bill 的第一个选项没有具体化为Matrix,因此对其进行线性代数运算会快得多(只要您坚持使用具有特定实现的函数 @ 987654326@参数)
猜你喜欢
  • 2021-12-01
  • 2012-06-17
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2017-11-18
相关资源
最近更新 更多