首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RcppArmadillo子Rcpp()引用更新Rcpp::数字矩阵

使用RcppArmadillo子Rcpp()引用更新Rcpp::数字矩阵
EN

Stack Overflow用户
提问于 2017-05-14 09:32:35
回答 1查看 943关注 0票数 0

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

我有以下情况:

  • 需要更新很少行和列的Rcpp::NumericMatrix m of 5 x 5
  • 它将通过引用传递给一个函数(void返回类型),该函数将将其转换为一个arma::mat,并更新相应的submat()
  • 此时,我不明白如何将函数内部发生的更改“应用”到传递给函数的m矩阵。

代码如下所示:

代码语言:javascript
复制
#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运行它,我使用:

代码语言:javascript
复制
m = matrix(0, 5, 5)

updateMatrix(m)

其结果是:

代码语言:javascript
复制
> 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,它们非常棒。我很感激对这种情况的任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-14 16:53:26

updateMatrix中分配的左边创建一个临时的,在赋值后被丢弃。因此,m一点也不改变。代码不能像您预期的那样工作,因为这意味着m的类型将发生变化。如下所示:

代码语言:javascript
复制
#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;
}

运行此代码将提供:

代码语言:javascript
复制
> 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43962398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档