从一个内存的一个块创建许多eigen :: vectorxd

Create many Eigen::VectorXd from one block of memory at once

本文关键字:一个 eigen vectorxd 许多 内存 创建      更新时间:2023-10-16

我有一个很大的 m -by -by- n内存块,可以想到长度 nm矢量。我现在想循环所有向量并修改它们。双for循环可以做到,但我发现Eigen::VectorXd S比手写循环快。以下工作(使用虚拟数据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;
}

现在,我想知道是否有可能进一步加快速度。例如,从每个单独的步骤中从data块重新创建Eigen::Maps似乎并不理想。

是否可以一次从大部分内存中创建一堆Eigen::VectorXd

遵循 @aviginsburg的建议,将块视为Eigen::MatrixXd的作品。当心特征中的列订购!

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