【问题标题】:Update Rcpp::NumericMatrix passed by reference using RcppArmadillo submat()使用 RcppArmadillo submat() 通过引用更新 Rcpp::NumericMatrix
【发布时间】:2017-05-14 09:32:35
【问题描述】:

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

我有以下场景:

  • Rcpp::NumericMatrix m of 5 x 5 需要更新几行和几列。
  • 它将通过引用传递给一个函数(void 返回类型),该函数将其转换为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

这是我第一次使用RcppRcppArmadillo,它们非常棒。感谢您对这种情况的任何帮助。

【问题讨论】:

    标签: c++ r pass-by-reference rcpp armadillo


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多