复制一个列VectorXd,以便在Eigen,C ++中构造一个MatrixXd

时间:2016-02-08 22:07:20

标签: c++ eigen replicate

假设我们有一个10x20的实矩阵:

Eigen::MatrixXd A(10,20);
A.setRandom();

我们想构建一个形式为

的10x10矩阵

B = [v v ... v v]

其中v是长度为10的列向量。对于此向量v,每个元素是A的每一行的平方范数,即:

v = ( ||x_1||^2, ||x_2||^2, ..., ||x_10||^2,)^T

其中x_j表示A的第j行。

构建矩阵B的最有效方法是什么?

我可以按如下方式构建v

Eigen::VectorXd v(10);
for (int i=1; i<10; i++)
{
    v(i) = A.row(i).squaredNorm();
}

我认为如果没有for循环,这一步就无法解决。我如何复制此列10次,以便如上所述填充B

1 个答案:

答案 0 :(得分:3)

你的假设是错误的。通过执行rowwise操作可以避免循环。然后,replication可以按如下方式完成。

#include <iostream>
#include <Eigen/Core>

int main ()
{
    Eigen::MatrixXd A(10,20), B, C;
    A.setRandom();

    Eigen::VectorXd v(10);
    v = A.rowwise().squaredNorm();

    B = v.replicate(1,10);

    std::cout << B << "\n\n";

    return 0;
}

它也可以用一行写成

    B =  A.rowwise().squaredNorm().replicate(1,10);

我强烈建议您阅读documentation。写得很好。