【问题标题】:Modify Eigen matrix diagonal修改特征矩阵对角线
【发布时间】:2015-11-20 19:45:18
【问题描述】:

我有一个Eigen::MatrixXd,我需要修改其对角线元素的值。特别是我有另一个Eigen::MatrixXd,它有一个单列和第一个矩阵的相同行数。

我需要在第一个矩阵的对角线上减去第二个矩阵元素的值。

例子:

A
 1 2 3
 4 5 6
 7 8 9

B
 1
 1
 1


A'
 0 2 3
 4 4 6
 7 8 8

我该怎么办?

【问题讨论】:

  • 减去任意对角线?或者它总是1(换句话说,你总是减去identity matrix
  • @CoryKramer 任意对角线

标签: c++ matrix eigen diagonal


【解决方案1】:

这对我有用:

A_2=A-B.asDiagonal();

【讨论】:

    【解决方案2】:

    实现这一目标的最简单、最快的方法是:

    Eigen::MatrixXd A1(3,3), B(3,1), A2;
    ...
    A2 = A1;
    A2.diagonal() -= B;
    

    当然,向量最好使用VectorXd类型(这里是B),最后如果B是常量,那么你可以使用数组工具:

    A2.diagonal().array() -= 1;
    

    【讨论】:

    • 这怎么比A - B.asDiagonal()更简单快捷?
    • 也许是因为它避免了将 B 创建为对角矩阵,并且只需要进行 A2.rows() 计算而不是 A2.size?虽然我认为当 Eigen 知道 B.asDiagonal() 是对角线时,它已经足够聪明了。
    【解决方案3】:

    Eigen 中的矩阵操作与数组的操作非常相似。索引从零开始,它是行主要的。文档(Eigen: The Matrix Class 写得很好,可以帮助您解决未来的问题。

    对于您所说的问题,下面给出了解决方案。

    #include <iostream>
    #include <eigen3/Eigen/Dense>
    using Eigen::MatrixXd;
    int main()
    {
      MatrixXd matA(3,3), matB(3,1);
      matA<<1,2,3,
        4,5,6,
        7,8,9;
      matB<<1,1,1;
      for(int i=0; i<3;i++)
        matA(i,i) -= matB(i);
      std::cout<<matA<<std::endl;
      return 0;
    }
    

    但是,我会分别对第一个和第二个矩阵使用 Matrix3d 和 Vector3d。

    【讨论】:

    • 最好使用matB.rows() 而不是硬编码数字3,正如@otah007 的回答中所做的那样
    【解决方案4】:
    for(int i = 0; i < matrix1.rows(); ++i)
        matrix1(i, i) -= matrix2(i, 0);
    

    此代码遍历矩阵 (matrix1.rows()) 的每一行,并从 matrix1 (matrix1(i, i)) 中的对角线中减去 matrix2 (matrix2(i, 0)) 的对应值。

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多