有没有办法从 arma::mat 矩阵创建 std::vector<arma::mat> 而无需创建矩阵的副本?
Is there a way to create std::vector<arma::mat> from arma::mat matrices without creating a copy of the matrices?
我是 C++
的新手。对于统计方法,我计算大矩阵,例如A
和 B
。它们是 n x n
,因此对于大样本量 n
,它们变得非常大。如果它们是 double
和 n = 70k
,我认为它可能是 30GB
的顺序?
因为所需的矩阵数量可能会有所不同,所以我实现了该算法以使用矩阵向量并对其进行迭代以进行某些操作。例如
arma::mat A;
arma::mat B;
std::vector<arma::mat> matrices;
matrices = {A, B};
有没有办法在不复制矩阵的情况下创建这个 std::vector
?
我试图通过这样做来检查内存是否相同:
logger->info("Memory address for A: {}.", (void *)&A);
logger->info("Memory address for matrices.at(0): {}.", (void *)&matrices.at(0));
它显示了不同的地址,所以我假设它正在创建一个副本,但我不确定。
我尝试使用
std::vector<arma::mat> matrices;
matrices.push_back(A);
内存地址仍然不同。有
std::vector<arma::mat> matrices;
matrices.push_back(std::move(A));
算法不再有效,因为矩阵为空。
您需要反转逻辑:让 std::vector
分配内存并创建矩阵。然后直接使用向量中的元素。例如:
std::vector<arma::mat> matrices;
matrices.resize(2);
arma::mat & A = matrices[0];
arma::mat & B = matrices[1];
// Initializing the values of A and B, and do stuff with them.
注意:这里需要注意的是,如果您之后向向量添加更多元素,即如果向量增长,对 A
和 B
的引用将变得无效。但是由于这些矩阵非常大,所以无论如何都要避免这种情况。
如果容器需要增长,您可能想看看例如std::list
.
我是 C++
的新手。对于统计方法,我计算大矩阵,例如A
和 B
。它们是 n x n
,因此对于大样本量 n
,它们变得非常大。如果它们是 double
和 n = 70k
,我认为它可能是 30GB
的顺序?
因为所需的矩阵数量可能会有所不同,所以我实现了该算法以使用矩阵向量并对其进行迭代以进行某些操作。例如
arma::mat A;
arma::mat B;
std::vector<arma::mat> matrices;
matrices = {A, B};
有没有办法在不复制矩阵的情况下创建这个 std::vector
?
我试图通过这样做来检查内存是否相同:
logger->info("Memory address for A: {}.", (void *)&A);
logger->info("Memory address for matrices.at(0): {}.", (void *)&matrices.at(0));
它显示了不同的地址,所以我假设它正在创建一个副本,但我不确定。
我尝试使用
std::vector<arma::mat> matrices;
matrices.push_back(A);
内存地址仍然不同。有
std::vector<arma::mat> matrices;
matrices.push_back(std::move(A));
算法不再有效,因为矩阵为空。
您需要反转逻辑:让 std::vector
分配内存并创建矩阵。然后直接使用向量中的元素。例如:
std::vector<arma::mat> matrices;
matrices.resize(2);
arma::mat & A = matrices[0];
arma::mat & B = matrices[1];
// Initializing the values of A and B, and do stuff with them.
注意:这里需要注意的是,如果您之后向向量添加更多元素,即如果向量增长,对 A
和 B
的引用将变得无效。但是由于这些矩阵非常大,所以无论如何都要避免这种情况。
如果容器需要增长,您可能想看看例如std::list
.