本征动态尺寸矩阵的C ++数组

时间:2019-07-19 20:43:05

标签: c++ arrays eigen eigen3

在我的应用程序中,我有一个一维网格,并且每个网格点都有一个矩阵(大小相等且为平方)。对于每个矩阵,必须执行特定的更新过程。目前,我定义了一个类型

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;

分配过程保持不变,并且代码似乎可以正常工作。但是,我假设数组“矩阵”仅包含指向每个单独矩阵存储的指针,由于在对每个矩阵执行操作之前必须从随机位置收集内存,因此整体性能会下降。

Q0:连续内存?

假设是否正确

  1. new []仅存储指针,矩阵数据存储在头部的任何地方?
  2. 拥有一个连续的内存区域来解决此类问题是否有益?

Q1:new []或std :: vector?

在注释中建议使用std :: vector。这有什么区别吗?两种解决方案的优点/缺点?

问题2:重载了新的[]?

我认为通过在Eigen :: Matrix类(或其基数之一)中重载运算符new []可以实现这种分配。这是个好主意吗?

问题3:替代方法?

我可以考虑使用大型Eigen :: Matrix。谁能在这里分享他们的经验?您还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

让我们根据对问题的评论和邮件列表帖子here总结到目前为止。我想鼓励大家编辑和添加内容。

Q0:连续的内存区域。

  1. 是的,仅存储指针(与使用new []或std :: vector无关)。
  2. 通常,在HPC应用程序中,连续的内存访问是有益的。

问题1:基本机制相同。

但是,std :: vector提供了更高的舒适度并减轻了开发人员的负担。后者还减少了错误和内存泄漏。

第二季度:使用std :: vector。

不建议重载new [],因为很难正确处理。例如,对齐问题可能导致不同机器上的错误。为了保证在所有计算机上的正确行为,请使用

std::vector<my_matrix_t, Eigen::aligned_allocator<my_matrix_t>> storage;

here所述。

Q3:对整个网格使用大特征矩阵。

或者,让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);