动态分配特征矩阵的标准向量,其大小在编译时已知

问题描述 投票:0回答:1

我正在编写一个程序,使用 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 特征矩阵。

c++ memory-management std eigen
1个回答
0
投票

来自评论:

您也许可以使用

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。

© www.soinside.com 2019 - 2024. All rights reserved.