【问题标题】:Assigning a vector to a matrix column in Eigen将向量分配给 Eigen 中的矩阵列
【发布时间】:2016-07-24 21:22:51
【问题描述】:

这个问题是匆忙问出来的。我原来的程序中的错误,不是这里显示的代码中的错字。错误是在我的程序中 v 由于某些情况没有被填充。

从这个线程中更有用的收获是在接受的答案中演示了将 std::vector 复制到特征矩阵的所有行或列。


我想将向量复制到矩阵的列中,如下所示:

#include <Eigen/Dense>
#include <vector>
#include <iostream>

int main() {
 int m = 10;

 std::vector<Eigen::VectorXd> v(m);
 Eigen::MatrixXd S(m,m);

 for (int i = 0; i != m; ++i) {
  v[i].resize(m);

  for (int j = 0; j != m; ++j) {
   v[i](j) = rand() % m;
  }

  //S.cols(i) = v[i]; //needed something like this
 }

 return 0;
}

S 的类型为 Eigen::MatrixXd,维度为 mxm。 v 是 Eigen::VectorXd 的 std::vector,其中每个 Eigen::VectorXd 的大小为 m,在 v 中有 m 个。

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    关于原始问题,您需要用Eigen::Map 包装std::vector。您可以/应该也使操作成为单线。

    重新措辞的问题被简化为一个错字。 S.cols(i) 应该是 S.col(i)

    int main()
    {
        size_t sz = 6;
        Eigen::MatrixXd S(sz, sz);
        std::vector<double> v(sz);
        std::vector<Eigen::VectorXd> vv(sz);
        for(int i = 0; i < sz; i++)
        {
            v[i] = i*2;
            vv[i] = Eigen::VectorXd::LinSpaced(sz, (i+sz), (i+sz)*2);
        }
    
        for (int i = 0; i != sz; ++i)
            S.col(i) = vv[i];
        std::cout << S << "\n\n";
    
        S.rowwise() = Eigen::Map<Eigen::RowVectorXd>(v.data(), sz);
        std::cout << S << "\n\n";
    
        S.colwise() = Eigen::Map<Eigen::VectorXd>(v.data(), sz);
        std::cout << S << "\n\n";
    
        return 0;
    }
    

    会输出

    6 7 8 9 10 11
    7.2 8.4 9.6 10.8 12 13.2
    8.4 9.8 11.2 12.6 14 15.4
    9.6 11.2 12.8 14.4 16 17.6
    10.8 12.6 14.4 16.2 18 19.8
    12 14 16 18 20 22

    0 2 4 6 8 10
    0 2 4 6 8 10
    0 2 4 6 8 10
    0 2 4 6 8 10
    0 2 4 6 8 10
    0 2 4 6 8 10

    0 0 0 0 0 0
    2 2 2 2 2 2
    4 4 4 4 4 4
    6 6 6 6 6 6
    8 8 8 8 8 8
    10 10 10 10 10 10

    【讨论】:

    • 显示 v 的类型时出现问题。请检查编辑。我想将唯一的 VectorXd 复制到 MatrixXd 的每一列。
    • 这就是为什么创建和发布minimal reproducible example 可以让提问者和回答者的事情变得更轻松。
    猜你喜欢
    • 2019-03-29
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多