繁体   English   中英

特征值矩阵的C ++数组

[英]C++ array of Eigen dynamically sized matrix

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

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. 有一个连续的内存区域来解决此类问题是否有益?

问题1:new []或std :: vector?

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

Q2:重载new []?

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

Q3:替代方法?

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

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

Q0:连续的内存区域。

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

问题1:基本机制相同。

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

问题2:使用std :: vector。

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

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

这里解释。

问题3:对整个网格使用大的本征矩阵。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM