在我的应用程序中,我有一个一维网格,并且每个网格点都有一个矩阵(大小相等且为平方)。对于每个矩阵,必须执行特定的更新过程。目前,我定义了一个类型
typedef Eigen::Matrix<double, N, N> my_matrix_t;
,并使用
为所有网格点分配矩阵my_matrix_t *matrices = new my_matrix_t[num_gridpoints];
现在,我要解决的是尺寸仅在运行时才知道(但仍然是二次方)的矩阵,即
typedef Eigen::Matrix<double, Dynamic, Dynamic> my_matrix_t;
分配过程保持不变,并且代码似乎可以正常工作。但是,我假设数组“矩阵”仅包含指向每个单独矩阵存储的指针,由于在对每个矩阵执行操作之前必须从随机位置收集内存,因此整体性能会下降。
假设是否正确
在注释中建议使用std :: vector。这有什么区别吗?两种解决方案的优点/缺点?
我认为通过在Eigen :: Matrix类(或其基数之一)中重载运算符new []可以实现这种分配。这是个好主意吗?
我可以考虑使用大型Eigen :: Matrix。谁能在这里分享他们的经验?您还有其他建议吗?
答案 0 :(得分:1)
让我们根据对问题的评论和邮件列表帖子here总结到目前为止。我想鼓励大家编辑和添加内容。
但是,std :: vector提供了更高的舒适度并减轻了开发人员的负担。后者还减少了错误和内存泄漏。
不建议重载new [],因为很难正确处理。例如,对齐问题可能导致不同机器上的错误。为了保证在所有计算机上的正确行为,请使用
std::vector<my_matrix_t, Eigen::aligned_allocator<my_matrix_t>> storage;
如here所述。
或者,让Eigen库直接使用其数据结构直接进行完整分配。这样可以确保正确解决诸如对齐和连续存储区域之类的问题。矩阵
Eigen::Matrix<double, Dynamic, Dynamic> storage(N, num_grid_points * N);
包含整个网格的所有矩阵,可以使用
进行寻址/* i + 1 'th matrix for i in [0, num_gridpoints - 1] */
auto matrix = storage.block(0, i * N, N, N);