其他分享
首页 > 其他分享> > c-使用RcppArmadillo submat()通过引用传递的Rcpp :: NumericMatrix更新

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

作者:互联网

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

我有以下情况:

> 5 x 5的Rcpp :: NumericMatrix m,需要更新几行和几列.
>它将通过引用传递给函数(无效返回类型),该函数会将其转换为arma :: mat,并更新相应的submat().
>目前,我还不了解如何将函数内部发生的更改“应用”到传递给函数的m矩阵.

代码如下:

#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

这是我第一次使用Rcpp和RcppArmadillo,它们绝对很棒.感谢您提供此方案的帮助.

解决方法:

在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

标签:c,r,pass-by-reference,rcpp,armadillo
来源: https://codeday.me/bug/20191012/1903657.html