gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:48:51 36 4
gpt4 key购买 nike

我有一个很大的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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com