gpt4 book ai didi

c++ - 将上层 MatrixXd 复制到下层 MatrixXd (Eigen3) C++ 库

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:31 29 4
gpt4 key购买 nike

我有一个下三角 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);

}
}

有最快的方法吗?我在想一些能够将下三角矩阵“复制”到上三角矩阵的内部方法。假设我有这个矩阵,我们称之为 m:

1 2 3
4 5 6
7 8 9

我需要在 m 中获得的是:

1 4 7
4 5 8
7 8 9

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

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

1 2 3
0 5 6
0 0 9

但是我还不能得到我想要的...

最佳答案

我在这里假设您指的是使用 Eigen3 C++ 库。从您的问题中不清楚。如果没有,你应该考虑一下。无论如何,在 Eigen 中,不需要实际复制三角形部分来获得自伴矩阵。 Eigen 有 View 的概念,你可以使用 self adjoint view为了执行像例如这样的操作

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

这里有一个小例子来说明使用固定大小的矩阵:

#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;
}

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

关于c++ - 将上层 MatrixXd 复制到下层 MatrixXd (Eigen3) C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12074705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com