【问题标题】:Is there a way to create std::vector<arma::mat> from arma::mat matrices without creating a copy of the matrices?有没有办法从 arma::mat 矩阵创建 std::vector<arma::mat> 而无需创建矩阵的副本?
【发布时间】:2022-12-29 09:59:12
【问题描述】:

我是 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));

该算法不再有效,因为矩阵为空。

【问题讨论】:

  • 如果你想要像向量一样的东西,但实际上指向来自不同容器的数据,那么你可能需要查看std::span
  • 谢谢,这听起来是个不错的建议。下面的答案似乎并不依赖于我正在使用的 C++ 版本的外部库。

标签: c++ armadillo


【解决方案1】:

您需要反转逻辑:让 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

【讨论】:

    【解决方案2】:

    第一,提前申请内存。 第二,使用高级构造函数: 垫子(ptr_aux_mem,n_rows,n_cols,copy_aux_mem = false,strict = false)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      相关资源
      最近更新 更多