3

私はRcppC++ 自体は言うまでもなく、C++ とその機能の初心者なので、これは専門家にとっては些細なことのように思えるかもしれません。ただし、愚かな質問などというものはないので、とにかく:

インデックスを使用して、C++ で NumericVector の複数の要素を一度にアドレス指定する方法があるかどうか疑問に思っていました。全体をより明確にするために、私がやろうとしていることと同等のRを次に示します。

# Initial vector
x <- 1:10

# Extract the 2nd, 5th and 8th element of the vector
x[c(2, 5, 8)]
[1] 2 5 8

これは、R を使用して実行している C++ 関数でこれまでに取得したものですsourceCpp。それは機能しますが、私にはかなり不便に思えます。私の目標を達成するためのより簡単な方法はありますか?

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector subsetNumVec(NumericVector x, IntegerVector index) {  
  // Length of the index vector
  int n = index.size();
  // Initialize output vector
  NumericVector out(n);

  // Subtract 1 from index as C++ starts to count at 0
  index = index - 1; 
  // Loop through index vector and extract values of x at the given positions
  for (int i = 0; i < n; i++) {
    out[i] = x[index[i]];
  }

  // Return output
  return out;
}

/*** R
  subsetNumVec(1:10, c(2, 5, 8))
*/
>   subsetNumVec(1:10, c(2, 5, 8))
[1] 2 5 8
4

2 に答える 2

1

これは、Rcpp ベクターではなく Armadillo ベクターを使用する場合に実行できます。

Rcppギャラリーには、完全な例を含む投稿があります。特に 2 番目の例を参照してください。索引付けエントリは (署名なし)uvecまたはumat.

于 2013-07-19T11:39:24.670 に答える
0

これより短い方法はないと思います!

しかし、あなたNumericVector subsetNumVec(NumericVector x, IntegerVector index)はエラーが発生しやすいです:

この行内

out[i] = x[index[i]];

範囲チェックなしでベクトルにアクセスします。xそのため、が空であるか、インデックスが範囲外であるという些細なケースでは、未定義の動作が発生します。

さらに、メソッドは参照によって呼び出すことができます

NumericVector subsetNumVec(const NumericVector& x, const IntegerVector& index)

両方のベクトルをコピーする理由はありません。index = index -1;減算を移動するだけですout[i] = x.at(index[i] - 1);

ここでx.at(index[i] - 1)は、false インデックスをスローします。ただし、エラー処理が必要です (空のベクターを返すか、外部で処理を行います)。

于 2013-07-19T11:21:16.987 に答える