我有一个很大的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
?
答案 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;
}