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

c++ eigen replicate

1870 观看

1回复

257 作者的声誉

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

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

我们想构造一个形式为10x10的矩阵

B = [v v ... v v]

其中v为length的列向量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();
}

我认为这一步骤不能一a而就for。我如何复制此列10次,使其B如上所述填充?

作者: nullgeppetto 的来源 发布者: 2016 年 2 月 8 日

回应 (1)


3

7759 作者的声誉

决定

您的假设是错误的。通过执行rowwise操作可以避免循环。然后,可以按照以下步骤进行复制

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

我强烈建议阅读文档。写得很好。

作者: Avi Ginsburg 发布者: 09.02.2016 06:51
32x32