使用 RcppArmadillo 对矩阵进行非连续子集化

Posted

技术标签:

【中文标题】使用 RcppArmadillo 对矩阵进行非连续子集化【英文标题】:Non-contiguous subsetting of matrix with RcppArmadillo 【发布时间】:2020-08-01 16:44:59 【问题描述】:

您好,很抱歉这个可能很愚蠢的问题。我过去学了一点 C++,但在过去的几年里,我只使用过 R。我需要为使用 Rcpp 编写的包转换一些 R 代码,特别是,我正在使用 RcppArmadillo。 现在我检查了文档,但我花了最后几个小时试图完成这项工作。假设我有一个矩阵 A 和一个索引向量 idx。如果我想提取一个只包含与 idx 中包含的索引对应的行的子矩阵,在 R 中我会这样做:

A[idx,]

在犰狳时我正在这样做:

A.rows(idx);

其中 A 是 mat 对象。但是,我收到以下错误: not matching function for call to 'arma::Mat<double>::rows(arma::vec&)' 我究竟做错了什么? 提前感谢您的帮助!

【问题讨论】:

你试过arma::uvec吗? 我想我解决了,非常感谢!问题不在于命令行,而是将 idx 设置为 vec 而不是 uvec,对吧? 【参考方案1】:

查看 continuous and non-continuous states 中子矩阵的 Armadillo API 文档。

arma::mat X = arma::randu<arma::mat>(10, 10);

arma::uvec indices;
indices << 2 << 3 << 6 << 8;

// Subset
X.rows(indices);

关于子集,请参阅详细介绍此类情况的长文:https://gallery.rcpp.org/articles/armadillo-subsetting/

为了获得更多翻译指导,我不久前写了一篇关于常见 R 操作及其在犰狳中的等价操作的指南。

https://thecoatlessprofessor.com/programming/cpp/common-operations-with-rcpparmadillo/

【讨论】:

以上是关于使用 RcppArmadillo 对矩阵进行非连续子集化的主要内容,如果未能解决你的问题,请参考以下文章

RcppArmadillo:对角矩阵乘法很慢

将大型矩阵传递给 RcppArmadillo 函数而不创建副本(高级构造函数)

使用 RcppArmadillo 在矩阵的列上应用函数有效,但在应用于行时返回错误

分配了矩阵列标准差的向量正在改变其值 (RcppArmadillo)

非连续矩阵的高级构造函数

使用 RcppArmadillo 时调用 one 或 eye 函数失败