我是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));
因为矩阵是空的,所以算法不再起作用。
2条答案
按热度按时间rvpgvaaj1#
你需要颠倒一下逻辑:让
std::vector
分配内存并创建矩阵,然后直接处理向量中的元素,例如:注意:这里需要特别注意的是,如果你在向量中添加了更多的元素,那么对
A
和B
的引用将变得无效,也就是说,如果向量变大了,但是由于这些矩阵非常大,你无论如何都要避免这种情况。如果容器需要增长,您可能需要查看
std::list
。mrzz3bfm2#
一是提前申请内存。
二是使用先进施工人员:
第一个月