将上层MatrixXd复制到较低的MatrixXd(Eigen3)C++库

Man*_*ete 6 c++ eigenvalue eigenvector eigen

我有一个较低的三角形MatrixXd,我想将其较低的值复制到上面,因为它将成为一个对称矩阵.我该怎么做?

到目前为止我已经完成了:

 MatrixXd m(n,n); 
 .....
 //do something with m
 for(j=0; j < n; j++)
       {
         for(i=0; i<j; i++)
           {
             m(i,j) = m(j,i);

           }
       }
Run Code Online (Sandbox Code Playgroud)

有最快的方法吗?我在考虑一些能够将下三角矩阵"复制"到鞋面的内部方法.说我有这个矩阵,我们称之为m:

1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

我需要获得的m是:

1 4 7
4 5 8
7 8 9
Run Code Online (Sandbox Code Playgroud)

我也知道你可以让矩阵的上部或下部做一些事情:

MatrixXd m1(n,n);
 m1 = m.triangularView<Eigen::Upper>();
cout << m1 <<endl;

1 2 3
0 5 6
0 0 9
Run Code Online (Sandbox Code Playgroud)

但我还不能得到我想要的东西......

Jak*_*kob 4

我假设您在这里指的是使用Eigen3 c++ 库。从你的问题中并不清楚这一点。如果没有,你应该考虑一下。无论如何,在本征内,不需要实际复制三角形部分来获得自共轭矩阵。Eigen 具有视图的概念,您可以使用自伴随视图来执行如下操作

using namespace Eigen;
MatrixXd m(m,n);
...
(generate uppper triangular entries in m)
...
VectorXd r(n), p(n);
r = m.selfadjointView<Upper>() * p;
Run Code Online (Sandbox Code Playgroud)

这是一个小例子来说明如何使用固定大小的矩阵:

#include <Eigen/Core>

using namespace std;
using namespace Eigen;

int main()
{
    Matrix2d m,c;
    m << 1, 2,
         0, 1;

    Vector2d x(0,2), r;

    // perform copy operation 
    c = m.selfadjointView<Upper>(); 
    cout << c << endl;

    // directly apply selfadjoint view in matrix operation
    // (no entries are copied)
    r = m.selfadjointView<Upper>() * x;
} 
Run Code Online (Sandbox Code Playgroud)

输出将为 [1, 2, 2, 1]。现在,结果与r您使用的结果相同c * x。只是不需要复制原始矩阵中的值来使其自伴。