c++ 是否有一种方法可以< arma::mat>从阿尔马::mat矩阵创建std::vector,而无需创建矩阵的副本?

roejwanj  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(112)

我是C++的新手。对于一种统计方法,我计算大型矩阵,例如AB。它们是n x n,因此对于大样本大小n,它们会变得非常大。如果它们是doublen = 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));

因为矩阵是空的,所以算法不再起作用。

rvpgvaaj

rvpgvaaj1#

你需要颠倒一下逻辑:让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.

注意:这里需要特别注意的是,如果你在向量中添加了更多的元素,那么对AB的引用将变得无效,也就是说,如果向量变大了,但是由于这些矩阵非常大,你无论如何都要避免这种情况。
如果容器需要增长,您可能需要查看std::list

mrzz3bfm

mrzz3bfm2#

一是提前申请内存。
二是使用先进施工人员:
第一个月

相关问题