修改特征矩阵对角线
Modify Eigen matrix diagonal
我有一个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
我该怎么办?
for(int i = 0; i < matrix1.rows(); ++i)
matrix1(i, i) -= matrix2(i, 0);
此代码遍历矩阵 (matrix1.rows()
) 的每一行,并从矩阵 1 (matrix1(i, i)
) 的对角线中减去矩阵 2 (matrix2(i, 0)
) 的对应值。
这对我有用:
A_2=A-B.asDiagonal();
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。
实现此目的的最简单、最快的方法是:
Eigen::MatrixXd A1(3,3), B(3,1), A2;
...
A2 = A1;
A2.diagonal() -= B;
当然,向量最好使用VectorXd
类型(这里为B
),最后如果B
是常量,那么你可以使用数组工具:
A2.diagonal().array() -= 1;
我有一个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
我该怎么办?
for(int i = 0; i < matrix1.rows(); ++i)
matrix1(i, i) -= matrix2(i, 0);
此代码遍历矩阵 (matrix1.rows()
) 的每一行,并从矩阵 1 (matrix1(i, i)
) 的对角线中减去矩阵 2 (matrix2(i, 0)
) 的对应值。
这对我有用:
A_2=A-B.asDiagonal();
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。
实现此目的的最简单、最快的方法是:
Eigen::MatrixXd A1(3,3), B(3,1), A2;
...
A2 = A1;
A2.diagonal() -= B;
当然,向量最好使用VectorXd
类型(这里为B
),最后如果B
是常量,那么你可以使用数组工具:
A2.diagonal().array() -= 1;