c++ - 一次从一 block 内存创建多个 Eigen::VectorXd

标签 c++ eigen

我有一个很大的m×n内存块,可以将其视为长度为n<的m个 vector/。我现在想循环所有 vector 并修改它们。双 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;
}

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

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

最佳答案

按照 @AviGinsburg 的建议,将 block 视为 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;
}

关于c++ - 一次从一 block 内存创建多个 Eigen::VectorXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991349/

相关文章:

c++ - 设置/删除窗口子类时正确传递/删除数据

visual-studio - 由于与 MSVC14 和 AVX 的未对齐访问而导致 Eigen 崩溃

c++ - 如何编写具有可选 Eigen::Ref 输出参数的函数?

c++ - 在滚动窗口上应用矩阵乘法的最聪明方法

c++ - 为什么install in done in c :\program files but not C:\? 提示UAC

c++ - 图标编辑器中的自定义颜色 (VS 2015)

C++ 模拟/测试 boost::asio::io_stream - 基于异步处理程序

c++ - 将 std::initializer_list 插入 std::map

c++ - 使用 Eigen 和 C++ 做大量矩阵乘积的列和

c++ - Eigen是否假设混叠?