2017-05-14 41 views
1

繼此question,我想了解如何有效地更新Rccp::NumericMatrix數據類型的子集。更新Rcpp :: NumericMatrix通過引用傳遞使用RcppArmadillo submat()

我有以下情形:

  • 5 x 5需要更新一些的行和列Rcpp::NumericMatrix m
  • 它將通過引用傳遞給函數(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他們是絕對驚人的。我很感謝這個場景的任何幫助。

回答

2

您在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