【问题标题】:Replicate a column VectorXd in order to construct a MatrixXd in Eigen, C++复制列 VectorXd 以在 Eigen、C++ 中构造 MatrixXd
【发布时间】: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?

【问题讨论】:

    标签: c++ eigen replicate


    【解决方案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。写的真好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2023-01-29
      • 2013-03-07
      相关资源
      最近更新 更多