у меня есть Eigen::MatrixXd
и мне нужно изменить значение элементов в его диагонали. В частности у меня есть другой Eigen::MatrixXd
с одним столбцом и таким же количеством строк первой матрицы.
Мне нужно вычесть на диагональ первой матрицы значение элементов второй матрицы.
Пример:
A
1 2 3
4 5 6
7 8 9
B
1
1
1A'
0 2 3
4 4 6
7 8 8
Как я могу сделать?
Это работает для меня:
A_2=A-B.asDiagonal();
Самый простой и быстрый способ сделать это:
Eigen::MatrixXd A1(3,3), B(3,1), A2;
...
A2 = A1;
A2.diagonal() -= B;
конечно, лучше использовать VectorXd
тип для векторов (здесь для B
) и, наконец, если B
является постоянным, то вы можете использовать массивы:
A2.diagonal().array() -= 1;
Матрица манипуляций в Eigen
работает очень похоже на массив. Индексирование начинается с нуля и является основным. Документация (Эйген: Матричный класс хорошо написано и может помочь вам решить будущие проблемы.
Для вашей заявленной проблемы решение приведено ниже.
#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 для первой и второй матрицы соответственно.
for(int i = 0; i < matrix1.rows(); ++i)
matrix1(i, i) -= matrix2(i, 0);
Этот код перебирает каждую строку матрицы (matrix1.rows()
) и вычитает соответствующее значение матрицы2 (matrix2(i, 0)
) из диагоналей в матрице1 (matrix1(i, i)
).