一次从一个内存块创建许多Eigen :: VectorXd

时间:2018-02-26 14:59:40

标签: c++ eigen

我有一个很大的m - by - n大块内存可以被认为是m长度为n的向量。我现在想循环遍历所有向量并修改它们。可以使用双for循环,但我发现Eigen::VectorXd比手写循环快。以下工作(使用虚拟数据a):

#include <Eigen/Core>
#include <vector>

int main() {
  const int m = 100;
  const int n = 70;
  std::vector<double> a(m*n);
  auto data = a.data();

  for (int i = 1; i < m; i++) {
    auto r_i1 = Eigen::Map<Eigen::VectorXd>(&data[(i-1)*n], n);
    auto r_i = Eigen::Map<Eigen::VectorXd>(&data[i*n], n);
    auto x = r_i + r_i1;
    auto z = x - r_i;
    auto y = (r_i - (x-z)) + (r_i1 - z);
    r_i = x;
    r_i1 = y;
  }

  return EXIT_SUCCESS;
}

现在,我想知道是否有可能进一步提高速度。例如,在每个步骤中从Eigen::Maps块重新创建data对我来说似乎不太理想。

是否可以同时从大块内存中创建一堆Eigen::VectorXd

1 个答案:

答案 0 :(得分:0)

按照@ AviGinsburg的建议,将该块视为Eigen::MatrixXd有效。注意Eigen中的列主要排序!

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

int main() {
  const int m = 100;
  const int n = 70;
  std::vector<double> a(m*n);
  auto data = a.data();

  auto r = Eigen::Map<Eigen::MatrixXd>(&data[0], n, m);

  for (int i = 1; i < m; i++) {
    auto x = r.col(i) + r.col(i-1);
    auto z = x - r.col(i);
    auto y = (r.col(i) - (x-z)) + (r.col(i-1) - z);
    r.col(i) = x;
    r.col(i-1) = y;
  }

  return EXIT_SUCCESS;
}