使用 RcppArmadillo submat() 更新 Rcpp::NumericMatrix 通过引用传递

Update Rcpp::NumericMatrix passed by reference using RcppArmadillo submat()

在此 之后,我试图了解如何有效地更新 Rccp::NumericMatrix 数据类型的子集。

我有以下场景:

代码如下所示:

#include <iostream>
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]


// [[Rcpp::export]]
void updateMatrix(const Rcpp::NumericMatrix &m)
{
    std::cout << m << std::endl;

    Rcpp::as<arma::mat>(m).submat(0, 0, 3, 3) = Rcpp::as<arma::mat>(m).submat(0, 0, 3, 3) + 1;

    std::cout << m << std::endl;
}

R 到 运行 我使用:

m = matrix(0, 5, 5)

updateMatrix(m)

结果是:

> updateMatrix(m)
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000

0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000

这是我第一次使用 RcppRcppArmadillo,它们绝对令人惊叹。感谢您对此场景的任何帮助。

您在 updateMatrix 中分配的左侧创建了一个在分配后被丢弃的临时文件。因此,m 根本没有改变。该代码无法按预期工作,因为这意味着 m 的类型会发生变化。往下看:

#include <typeinfo>
#include <iostream>
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]


// [[Rcpp::export]]
void updateMatrix(const Rcpp::NumericMatrix &m)
{
  std::cout << m << std::endl;

  std::cout << typeid(m).name() << std::endl;

  arma::mat m2 = Rcpp::as<arma::mat>(m);

  std::cout << typeid(m2).name() << std::endl;

  m2.submat(0, 0, 3, 3) = Rcpp::as<arma::mat>(m).submat(0, 0, 3, 3) + 1;

  std::cout << m2 << std::endl;
}

运行 此代码给出:

> m = matrix(0, 5, 5)
> updateMatrix(m)
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000
0.00000 0.00000 0.00000 0.00000 0.00000

N4Rcpp6MatrixILi14ENS_15PreserveStorageEEE
N4arma3MatIdEE
   1.0000   1.0000   1.0000   1.0000        0
   1.0000   1.0000   1.0000   1.0000        0
   1.0000   1.0000   1.0000   1.0000        0
   1.0000   1.0000   1.0000   1.0000        0
        0        0        0        0        0