gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:54:04 25 4
gpt4 key购买 nike

关注此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,它们绝对令人惊叹。感谢您对此场景的任何帮助。

最佳答案

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++ - 使用 RcppArmadillo submat() 更新通过引用传递的 Rcpp::NumericMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com