gpt4 book ai didi

c++ - Rcpp:处理包含列表的列表

转载 作者:太空狗 更新时间:2023-10-29 21:00:43 26 4
gpt4 key购买 nike

让我们首先生成一些列表,其中包含列表:

lappend <- function(lst, ...){
lst <- c(lst, list(...))
return(lst)
}

scalarList <- list()
vectorList <- list()
MatrixList <- list()

for (i in 1:3){
scalarList <- lappend(scalarList,i)
vectorList <- lappend(vectorList,0:i)
MatrixList <- lappend(MatrixList, diag(i + 1))
}

myRList <- list(scalarList = scalarList, vectorList = vectorList,
MatrixList = MatrixList)

现在我们的 myRList 已经准备好了,我想用 C++ 编写一个函数如下:

1) 输入:1) myRList,2) 从 1 到 3 的 id

2) 输出:函数应分别打印与输入id对应的标量、 vector 和矩阵。

3) 这个函数的写法可能有很多种。我特别想读入列表并将其分配给相应的 arma 对象,然后打印它。原因是我写这个简化的例子是为了向你们学习如何在 Rcpp 中提取另一个列表中的列表元素并将其分配给 arma 对象。

这是我的 C++ 代码:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>

// [[Rcpp::export]]
double myListExtractor( Rcpp::List aList_In_R, int id){
int myScalar = Rcpp::as<double>(aList_In_R["scalarList"][id]); //? what to do ?
arma::vec myVector = Rcpp::as<arma::vec>(aList_In_R["vectorList"[id]]); //???
arma::mat myMatrix = Rcpp::as<arma::mat>(aList_In_R["MatrixList"[id]]); //???

// If I manage to do the three assignments above, then printing is easy:

Rcpp::Rcout << "myScalar = " << myScalar << std::endl;
Rcpp::Rcout << "myVector = " << myVector << std::endl;
Rcpp::Rcout << "myMatrix = " << myMatrix << std::endl;

return 1; // we don't care about the return for now
}

同样,我 100% 同意没有必要将它们分配给 arma 对象然后打印。在我自己的代码中,我用 arma 对象做了很多代数运算,这就是我强调这个作业以学习如何修复我的代码的原因/

非常感谢您的帮助。另外,我花了 3 个小时浏览网络,但没有找到任何答案。

最佳答案

因为 List对象对它们包含的对象类型一无所知,你必须 as在每个子集级别。例如:

int myScalar = Rcpp::as<double>( Rcpp::as<Rcpp::List>(aList_In_R["scalarList"])[id] );

这样,我们可以向编译器发出信号,表明我们正在从 aList_In_R 中提取插槽。是 List ,以及我们为 List 提供的所有方法s 应该适用于此。这很丑陋,但这是使用静态类型语言对动态类型语言中使用的对象进行操作的不幸结果。

有一些工作是将模板化列表容器放入 Rcpp这可能有助于解决这种情况;例如而不是 List你可能有一个 ListOf< List >由此子集运算符将“知道”它应该返回 List子集化之后,这可能会更好一些。也许它可以深入 ListOf< ListOf< double > >等等……

关于c++ - Rcpp:处理包含列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21249643/

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