从RARMADILO中矩阵的子集中获取元素

从RARMADILO中矩阵的子集中获取元素,r,rcpp,armadillo,R,Rcpp,Armadillo,我有一个大的ish矩阵。我试着用动态变化的权重从中取样。由于它被迫在R中使用循环,所以我尝试在Rcpp中实现它,这样它就有机会运行得更快一些。经过一点实验,我想我已经找到了如何随机获取具有正确权重的索引的方法 诀窍在于,我在任何给定的时间只从列的子集进行采样(如果在C中更有效,则可以更改为行-矩阵实际上是对称的)。我的索引仅为该列子集定义。在R中,我会按照 large_matrix[, columns_of_interest][index] 这个很好用。我如何使用Rcpp/Armadillo进

我有一个大的ish矩阵。我试着用动态变化的权重从中取样。由于它被迫在R中使用循环,所以我尝试在Rcpp中实现它,这样它就有机会运行得更快一些。经过一点实验,我想我已经找到了如何随机获取具有正确权重的索引的方法

诀窍在于,我在任何给定的时间只从列的子集进行采样(如果在C中更有效,则可以更改为行-矩阵实际上是对称的)。我的索引仅为该列子集定义。在R中,我会按照

large_matrix[, columns_of_interest][index]
这个很好用。我如何使用Rcpp/Armadillo进行等效操作?我猜

cppFunction("arma::vec element_from_subset(arma::mat D, arma::uvec i, arma::uvec columns) {
  # arma::mat D_subset = D.cols(columns);
  return D.cols(columns).elem(i);

  }", depends = "RcppArmadillo")
编译失败(并且
.at
而不是
。.elem
也不起作用,在paranthesis中围绕事物的标准R技巧也不起作用

这确实有效,但这正是我试图避免的:

cppFunction("arma::vec element_from_subset(arma::mat D, arma::uvec i, arma::uvec columns) {
  arma::mat D_subset = D.cols(columns);
  return D_subset.elem(i);

  }", depends = "RcppArmadillo")
是否有任何方法可以在不保存
D.cols(columns)
的情况下对此进行调整?

简短回答:否

但是,问题的措辞不正确。想想这里发生了什么:

(M <- matrix(1:9, 3, 3)) 
#>      [,1] [,2] [,3]
#> [1,]    1    4    7
#> [2,]    2    5    8
#> [3,]    3    6    9

columns_of_interest = 1:2
M[, columns_of_interest] 
#>      [,1] [,2]
#> [1,]    1    4
#> [2,]    2    5
#> [3,]    3    6 
因此,从本质上讲,真正发生的事情是

Rcpp::cppFunction("double element_from_subset(arma::mat D, int i, int j) { 
                  return D(i, j);
                  }", depends = "RcppArmadillo")
element_from_subset(M, 0, 0)
#> [1] 1
<>我是根据R和C++代码发布的,例如R给出1值,C++有一个返回类型,只允许一个值。
OP发布的代码显示时没有错误。编译的初始错误将表明在
arma
类中使用
Rcpp
对象存在问题。如果我们更正类型,例如用
arma
arm>的适当类型替换
Rcpp::IntegerVector
a::uvec
,然后编译会产生信息更丰富的错误消息

更正代码:

Rcpp::cppFunction("double element_from_subset(arma::mat D, int i, arma::uvec columns) { 
  return D.cols(columns).elem(i);
  }", depends = "RcppArmadillo")
错误消息:

file6cf4cef8267.cpp:10:26: error: no member named 'elem' in 'arma::subview_elem2<double, arma::Mat<unsigned int>, arma::Mat<unsigned int> >'
  return D.cols(columns).elem(i);
         ~~~~~~~~~~~~~~~ ^
1 error generated.
make: *** [file6cf4cef8267.o] Error 1
file6cf4cef8267.cpp:10:26:错误:“arma::subview\u elem2”中没有名为“elem”的成员
返回D.cols(列).elem(i);
~~~~~~~~~~~~~~~ ^
生成1个错误。
make:**[file6cf4cef8267.o]错误1
因此,无法对通过从犰狳对象中获取a子集而创建的子视图进行子集划分


你可能想了解犰狳的一些分类特征,它们非常有用

  • Rcpp画廊:
  • 将R代码转换为犰狳的指南:
  • 犰狳专用文件
    • 矩阵子集:
    • 个别参赛作品:
    • sub2ind()
    • ind2sub()

免责声明:我参与或撰写的第一个和第二个链接。

我们在网站上有几篇关于子集的文章,包括。也许这些可以帮助你开始吗?@DirkEddelbuettel,我在发布之前通读了犰狳子集的文章-这对设置我的体重功能非常有帮助。然而,我没有看到任何从矩阵子集中提取元素的例子。(或子集的子集,等等-任何我可以直接适应的东西)。我现在在看Rcpp图库,但我对“子集”的简单搜索看起来不太有希望。我会继续看。谢谢你的解释和链接-我已经研究了其中的几个,并将继续这样做。我确实检查了一下,发现我的可复制示例中存在错误(并修复了它们-可能是在你处理所有这些问题时)。也许我最好的解决方案是找出索引在大数据框中的位置,然后直接获取它。无论如何,谢谢!
file6cf4cef8267.cpp:10:26: error: no member named 'elem' in 'arma::subview_elem2<double, arma::Mat<unsigned int>, arma::Mat<unsigned int> >'
  return D.cols(columns).elem(i);
         ~~~~~~~~~~~~~~~ ^
1 error generated.
make: *** [file6cf4cef8267.o] Error 1