一次从一个内存块中创建多个 Eigen::VectorXd
Create many Eigen::VectorXd from one block of memory at once
我有一个很大的 m
×n
内存块,可以认为是 m
个长度为 n
的向量。我现在想遍历所有向量并修改它们。双 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
作品。注意 Eigen 中的 column-major 排序!
#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;
}
我有一个很大的 m
×n
内存块,可以认为是 m
个长度为 n
的向量。我现在想遍历所有向量并修改它们。双 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
作品。注意 Eigen 中的 column-major 排序!
#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;
}