我正在编写一个程序,使用 Eigen 线性代数库进行一些计算要求较高的计算。基本上,我想在循环中对大量稍大(大约 300 x 300)的矩阵进行对角化。所以,我想做的是,在开始循环之前,我分配一个包含几个特征矩阵的 STL 容器,我想在每次迭代中重用它们。以下代码有效:
std::vector<Eigen::Matrix<complex<double>, Eigen::Dynamic, Eigen::Dynamic>> A;
for (int i = 0; i < Imax; i++){
// some calculation using A
}
但是,我在编译时知道 A 的维度和 STL 向量的大小。是否可以在运行循环之前动态分配矩阵向量,以便它们具有固定的非零大小?基本上,我的向量中有 4 个元素,每个元素都是一个 300 x 300 特征矩阵。
来自评论:
您也许可以使用
来代替std::array
我刚刚这么做了。有用。但是,如何确定动态分配的特征矩阵的大小?例如,如果我有一个矩阵,我可以执行
但由于某种原因,我不确定在Eigen::Matrix<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic> Hk(100, 100) A;
期间如何执行此操作std::array
正如我在评论中指出的,您应该使用 预定义类型定义 将该代码缩短为
std::vector<Eigen::MatrixXcd>
或 std::array<Eigen::MatrixXcd, N>
。至于如何正确初始化的主要问题:你不能直接这样做而不浪费运行时间。
您可能认为这有效:
A.fill(Eigen::MatrixXcd(300, 300))
(使用std::array::fill
)或A.assign(N, Eigen::MatrixXcd(300, 300))
与std::vector::assign
,但这会创建未初始化内存的无意义副本。
可能有一些使用奇特的迭代器/范围或模板魔法的复杂方法。但您也可以保持简单:
std::array<Eigen::MatrixXcd, N> A;
for(auto& ai: A)
ai.resize(300, 300);
没有性能损失。如果您使用并行化并且每个条目都进入不同的线程,请延迟分配,直到特定线程可以分配自己的内存。特别有助于 NUMA。