代码之家  ›  专栏  ›  技术社区  ›  Melissa Key

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

  •  0
  • Melissa Key  · 技术社区  · 7 年前

    我有一个很大的矩阵。我试着用动态变化的重量从中取样。由于它被迫在r中使用循环,所以我尝试在rcpp中实现它,这样它就有可能运行得更快一些。经过一番试验,我想我已经想出了如何用正确的权重随机获取一个索引。

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

    large_matrix[, columns_of_interest][index]
    

    这个很好用。我如何使用RCPP/犰狳做等效的?我猜想

    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 也不起作用,在偏执狂中,周围事物的标准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) ?

    1 回复  |  直到 7 年前
        1
  •  0
  •   coatless    7 年前

    简而言之:不。

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

    (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 
    

    从这里开始,如果我们有 index 如果是1,那么我们得到:

    index = 1
    M[, columns_of_interest][index]
    #> 1
    

    所以,本质上,真正发生的是 (i,j) . 因此,您应该使用:

    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发布的代码,没有错误。编译后的初始错误将指示使用 Rcpp 对象内部 arma 班级。如果我们纠正类型,例如 Rcpp::IntegerVector 用一个 阿玛 适当类型的 arma::ivec arma::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
    

    所以,没有办法 子集 子视图 它是由 子集 从犰狳身上。


    你可能想了解一下犰狳的一些分类特征。他们非常乐于助人。

    免责声明: 第一和第二个链接我都有贡献或写。