10

パッケージを使用して、Rパッケージの単純な部分にC++を使用することを検討していRcppます。私はC++の初心者です(しかし、学びたいと思っています!)。私は優れたものを使用していくつかの単純なcppプログラムを実装しましたRcpp-実際、パッケージは私にC++を学ぶ動機を与えました...

とにかく、私は単純な問題で立ち往生しています。私が修正できれば、それは大いに役立つでしょう。NumericVectorサブセット化してから並べ替えたいものがあります。以下のコードは、ベクトル全体をソートします(そして、NAも処理します。これは私が必要としているものです)。

私の質問は、このベクトルの一部を抽出し、並べ替えて他の処理に使用できるようにしたいということです-どうすればよいですか?たとえば、長さが10のベクトルの場合、要素を5:10に抽出して並べ替えるにはどうすればよいですか?

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
RcppExport SEXP rollP(SEXP x) {
  NumericVector A(x); // the data  
  A = sort_unique(A);  
  return A;
}

私はRからこれを呼び出します:

sourceCpp( "rollP.cpp")
rollP(10:1)
# [1]  1  2  3  4  5  6  7  8  9 10
4

4 に答える 4

12

3つのバリエーションがあります。

include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector rollP(NumericVector A, int start, int end) {
  NumericVector B(end-start+1) ;
  std::copy( A.begin() + start-1, A.begin() + end, B.begin() ) ;
  return B.sort() ;
}

// [[Rcpp::export]]
NumericVector rollP2(NumericVector A, int start, int end) {
  NumericVector B( A.begin() + start-1, A.begin() + end ) ;
  return B.sort() ;
}

// [[Rcpp::export]]
NumericVector rollP3(NumericVector A, int start, int end) {
  NumericVector B = A[seq(start-1, end-1)] ;
  return B.sort() ;
}

startから渡されendているかのように、1ベースのインデックスとして意味されます。A[start:end]R

于 2012-11-23T07:39:07.300 に答える
4

C ++のインデックス作成、イテレータ、および全体を調べる必要があります。少なくとも、インターフェイス(vector、fromInd、toInd)を変更し、何を返したいかを理解する必要があります。

質問の解釈の1つは、サブセットをから[fromInd, toInd)新しいベクトルにコピーし、並べ替えて返すことです。それはすべて標準のC++運賃であり、優れた(そして無料の!!)C++注釈のような優れたテキストが役に立ちます。かなり強力なSTLセクションもあります。

于 2012-11-22T20:33:50.823 に答える
3

std::sliceで使用できますstd::valarray。ただし、std::vector具体的に使用する場合は、を使用std::copyしてベクトルの一部を抽出してから、を使用std::sortして抽出されたベクトルのスライスを並べ替えることができます。

于 2012-11-22T20:23:39.307 に答える
2

std::sortこれは、 2つのイテレータを受け取る実装を使用することで非常に簡単に実行できます。

#include <vector>
#include <cinttypes>
#include <algorithm>

template <typename SeqContainer>
SeqContainer slicesort(SeqContainer const& sq, size_t begin, size_t end) {
  auto const b = std::begin(sq)+begin;
  auto const e = std::begin(sq)+end;
  if (b <= std::end(sq) && e <= std::end(sq)) {
    SeqContainer copy(b,e);
    std::sort(copy.begin(),copy.end());
    return copy;
  }
  return SeqContainer();
}

次のように呼び出すことができます

  std::vector<int> v = {3,1,7,3,6,-2,-8,-7,-1,-4,2,3,9};
  std::vector<int> v2 = slicesort(v,5,10);
于 2012-11-23T08:00:39.443 に答える