gpt4 book ai didi

r - Rcpp 中列表的索引元素

转载 作者:行者123 更新时间:2023-12-02 05:36:35 27 4
gpt4 key购买 nike

假设我在 Rcpp 中有一个 List,这里称为包含矩阵的 x。我可以使用 x[0] 或其他东西提取其中一个元素。但是,如何提取该矩阵的特定元素?我的第一个想法是 x[0](0,0) ,但这似乎不起作用。我尝试使用 * 符号,但也不起作用。

这里是一些打印矩阵的示例代码(显示可以轻松提取矩阵):

library("Rcpp")

cppFunction(
includes = '
NumericMatrix RandMat(int nrow, int ncol)
{
int N = nrow * ncol;
NumericMatrix Res(nrow,ncol);
NumericVector Rands = runif(N);
for (int i = 0; i < N; i++)
{
Res[i] = Rands[i];
}
return(Res);
}',

code = '
void foo()
{
List x;
x[0] = RandMat(3,3);
Rf_PrintValue(wrap( x[0] )); // Prints first matrix in list.
}
')


foo()

如何更改此处的行 Rf_PrintValue(wrap( x[0] )); 来打印第一行和第一列中的元素?在代码中我想使用它,因为我需要提取这个元素来进行计算。

最佳答案

快速的:

  1. C++ 中的复合表达式有时会咬人;模板魔法会妨碍。所以只需从 List 进行分配对象 a 无论元素是什么,例如 NumericMatrix .

  2. 然后从NumericMatrix中选择如您认为合适。我们有 row、col、element... 访问权限。

  3. 使用 Rcpp::Rcout << anElement 可以更轻松地进行打印但请注意,我们目前无法打印整个矩阵或向量 - 但 intdouble类型很好。

编辑:

这是一个示例实现。

#include <Rcpp.h>

// [[Rcpp::export]]
double sacha(Rcpp::List L) {
double sum = 0;
for (int i=0; i<L.size(); i++) {
Rcpp::NumericMatrix M = L[i];
double topleft = M(0,0);
sum += topleft;
Rcpp::Rcout << "Element is " << topleft << std::endl;
}
return sum;
}

/*** R
set.seed(42)
L <- list(matrix(rnorm(9),3), matrix(1:9,3), matrix(sqrt(1:4),2))
sacha(L) # fix typo
*/

及其结果:

R> Rcpp::sourceCpp('/tmp/sacha.cpp')

R> set.seed(42)

R> L <- list(matrix(rnorm(9),3), matrix(1:9,3), matrix(sqrt(1:4),2))

R> sacha(L)
Element is 1.37096
Element is 1
Element is 1
[1] 3.37096
R>

关于r - Rcpp 中列表的索引元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17973442/

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