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