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

Posted

技术标签:

【中文标题】复制列 VectorXd 以在 Eigen、C++ 中构造 MatrixXd【英文标题】:Replicate a column VectorXd in order to construct a MatrixXd in Eigen, C++ 【发布时间】:2016-02-08 22:07:19 【问题描述】:

假设我们有一个 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】:

你的假设是错误的。通过执行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。写的真好。

【讨论】:

以上是关于复制列 VectorXd 以在 Eigen、C++ 中构造 MatrixXd的主要内容,如果未能解决你的问题,请参考以下文章

如何根据索引的`vector<int>`使用来自另一个`Eigen::VectorXd`向量的值初始化`Eigen::VectorXd`

如何从双指针数组创建 Eigen::VectorXd

在 Rcpp(Eigen) 中的 NumericVector/Matrix 和 VectorXd/MatrixXd 之间转换以执行 Cholesky 求解

从 std::vector 创建 Eigen::Ref

是否有一种直接、快速的方式将 list<VectorXd>“映射”到 MatrixXd?

MatrixXd 和 VectorXd 之间的特征 C++ 矩阵乘法