如何用Rcpp找到矩阵的两个特定列之间的最小值索引?

时间:2017-12-31 21:53:17

标签: c++ r rcpp

我有一个5x5矩阵,想要找到列之间最小值的索引" 1"和" 3"。在 R 中,我会这样做:

set.seed(1984)
m <- matrix(sample.int(25,25), 5)
min <- which(m[,c(1,3)] == min(m[,c(1,3)]), arr.ind = TRUE)

使用Rcpp最有效的方法是什么?

1 个答案:

答案 0 :(得分:4)

我会选择在 Rcpp 上使用 RcppArmadillo ,因为它具有更强大的矩阵操作。例如,您可以快速找到子集的index_min() or index_max(),然后使用ind2sub()将其转换为下标表示法。需要注意的一点是 C ++ 使用基于0的索引而 R 使用基于1的索引,因此您应该确保添加 1 目标是使用 R 中的索引下标。

以下内容适合您的情况:

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

// [[Rcpp::export]]
arma::urowvec get_min_cols(const arma::mat& x, const arma::uvec& col_indexes) {

  // Obtain the minimum index from the selected columns
  arma::uword min_index = x.cols(col_indexes).index_min();

  // Obtain the subscript notation from index based on reduced dimensions
  arma::uvec min_subnot = arma::ind2sub(arma::size(x.n_rows, col_indexes.n_elem),
                                        min_index);

  // Transpose to row vector and 
  // translate indices to _R_ from _C++_ by adding 1
  return min_subnot.t() + 1;
}

测试:

set.seed(1984)
m = matrix(sample.int(25,25), 5)

col_indexes = c(1, 3)

min_loc_r = which(m[, col_indexes] == min(m[, col_indexes]), arr.ind = TRUE)

# Note that the column indices has been translated to C++
min_loc_cpp = get_min_cols(m, col_indexes - 1)

min_loc_r
#      row col
# [1,]   5   2

min_loc_cpp
#      [,1] [,2]
# [1,]    5    2