修改特征矩阵对角线

时间:2015-11-20 19:45:18

标签: c++ matrix eigen diagonal

我有一个EnumApplications.IOS.ToString() ,我需要修改对角线中元素的值。特别是我有另一个Eigen::MatrixXd,只有一个列和第一个矩阵的行数相同。

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

示例:

Eigen::MatrixXd

我该怎么办?

4 个答案:

答案 0 :(得分:6)

这对我有用:

A_2=A-B.asDiagonal();

答案 1 :(得分:5)

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

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

当然,最好使用VectorXd类型的向量(此处为B),最后如果B是常量,则可以使用数组工具:

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

答案 2 :(得分:0)

for(int i = 0; i < matrix1.rows(); ++i)
    matrix1(i, i) -= matrix2(i, 0);

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

答案 3 :(得分:0)

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作为第一个和第二个矩阵。