在此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这是我第一次使用Rcpp和RcppArmadillo,它们非常棒。我很感激对这种情况的任何帮助。
发布于 2017-05-14 16:53:26
在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 0https://stackoverflow.com/questions/43962398
复制相似问题