使用特征矩阵构建3D结构的最有效选项
Most efficient option for build 3D structures using Eigen matrices
我需要一个3D矩阵/数组结构在我的代码,现在我依赖于我的矩阵和向量的Eigen。
现在我正在使用new
创建一个3D结构:
MatrixXd* cube= new MatrixXd[60];
for (int i; i<60; i++) cube[i]=MatrixXd(60,60);
和访问值:
double val;
MatrixXd pos;
for (int i; i<60; i++){
pos=cube[i];
for (int j; j<60; j++){
for (int k; k<60; k++){
val=pos(j,k);
//...
}
}
}
然而,现在这部分代码非常慢,这让我相信这可能不是最有效的方法。有其他选择吗?
当被问到这个问题时,虽然它还没有提供,但Eigen已经提供了一个Tensor模块一段时间了。它仍处于"不受支持"阶段(意味着API可能会更改),但基本功能应该基本稳定。文档分散在这里和这里。
另一种方法是创建一个非常大的内存块,并从中映射特征矩阵:
double* data = new double(60*60 * 60*60*60);
Map<MatrixXd> Mijk(data+60*(60*(60*k)+j)+i), 60, 60);
在这个阶段,您可以像使用MatrixXd对象一样使用Mijk。但是,由于这不是MatrixXd类型,如果要将其传递给函数,则函数必须:
- 的格式为
foo(Map<MatrixXd> mat)
- 为模板函数:
template<typename Der> void foo(const MatrixBase<Der>& mat)
- 取一个
Ref<MatrixXd>
对象,它可以同时处理Map<>
和Matrix<>
对象,而不是模板函数,也没有副本。(doc)
我使用的一个解决方案是形成一个包含所有需要堆叠的矩阵的胖矩阵。
MatrixXd A(60*60,60);
,然后用块操作
访问它们A0 = A.block<60,60>(0*60,0);
...
A5 = A.block<60,60>(5*60,0);
相关文章:
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 有效地展平结构数组
- 在C++中更有效地分配结构体的内存
- C 是什么是在结构内部洗牌的最有效方法
- 存储大量会话的最有效数据结构是什么?
- 指向结构的指针如何有效
- 如何有效地用向量填充结构
- 如何有效地将这种数据结构发送到CUDA
- 为什么离开作用域后仍然有对结构的有效访问
- 具有未初始化成员的结构的constexpr默认构造函数仅在模板化时有效
- C++图结构中边的有效表示
- 在编译时有效配置类层次结构
- 插入最有效的数据结构,然后使用不同的条件进行排序
- 在结构向量中搜索特定ID的有效方法
- 用于存储帕累托最优解的有效结构
- 删除导致有效结构指针中断的原因
- 在 c++ 中通过 int id 跟踪少量结构类型的有效方法是什么
- 如何用树数据结构有效地实现无序映射
- 语言律师-正在铸造具有公共基础和布局的非多态结构有效的C++