从一个内存的一个块创建许多eigen :: vectorxd
Create many Eigen::VectorXd from one block of memory at once
我有一个很大的 m
-by -by- n
内存块,可以想到长度 n
的 m
矢量。我现在想循环所有向量并修改它们。双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;
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 使用 Eigen 3 库编写一个带有转置作为参数的函数
- 从一个内存的一个块创建许多eigen :: vectorxd
- eigen如何在零和一个之间重新分布矩阵值
- 将“Eigen::VectorXd”的集合合并为一个大的“Eigen::VectorXd”
- 有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
- 如何使用另一个"Eigen::VectorXd"向量中的值初始化"Eigen::VectorXd",基于索引的"向量<int>"
- 在C++中,这个Eigen::张量的声明是安全的,还是有缺陷的?我应该为它提交一个问题吗
- 用C++中的Eigen包求解一个三对角矩阵
- 如何使用c++中的Eigen库创建一个高效的3D矩阵
- 我如何初始化一个SparseVector在Eigen
- 从lambda返回一个Eigen::Map
- 在Eigen (c++库)中创建一个N-D矩阵
- 用Eigen和c++做了一个大量矩阵乘积的列