首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将上层MatrixXd复制到下层MatrixXd (Eigen3) C++库

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

Stack Overflow用户
提问于 2012-08-22 21:52:48
回答 7查看 2.9K关注 0票数 6

我得到了一个下三角形的MatrixXd,我想把它的下边的值复制到上面,因为它会变成一个对称矩阵。我该怎么做呢?

到目前为止,我已经做到了:

代码语言:javascript
复制
 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

代码语言:javascript
复制
1 2 3
4 5 6
7 8 9

我需要在m中获取的内容是:

代码语言:javascript
复制
1 4 7
4 5 8
7 8 9

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

代码语言:javascript
复制
MatrixXd m1(n,n);
 m1 = m.triangularView<Eigen::Upper>();
cout << m1 <<endl;

1 2 3
0 5 6
0 0 9

但我还不能得到我想要的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-08-23 16:16:17

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

代码语言:javascript
复制
using namespace Eigen;
MatrixXd m(m,n);
...
(generate uppper triangular entries in m)
...
VectorXd r(n), p(n);
r = m.selfadjointView<Upper>() * p;

下面是一个使用固定大小矩阵的小示例:

代码语言:javascript
复制
#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时的结果相同。只是不需要复制原始矩阵中的值来使其自伴随。

票数 4
EN

Stack Overflow用户

发布于 2012-09-02 17:20:20

如果您不能选择selfadjointView,则解决方案是在目标矩阵上使用triangularView:

m.triangularView<Lower>() = m.transpose();

票数 3
EN

Stack Overflow用户

发布于 2014-04-09 23:35:36

我能想到的最简单的方法是,复制m矩阵的上半部分,转换到上半部分:

代码语言:javascript
复制
    m.triangularView<Upper>() = m.transpose();

例如,以下代码:

代码语言:javascript
复制
    MatrixXd m(3,3);
    m << 1, 2, 3, 4, 5, 6, 7, 8, 9;

    m.triangularView<Upper>() = m.transpose();
    std::cout << m << std::endl;

给出了您要求的输出:

代码语言:javascript
复制
1 4 7
4 5 8
7 8 9

致以问候。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12074705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档