Rcppによって呼び出されるc ++カウントアルゴリズムテンプレート

Amy_777

ベクトル内の特定の要素の出現をカウントできるRcppによって呼び出されるC ++カウントアルゴリズム。テンプレートを使用する必要があります。私の試み:

countRcpp <-'
#include<iostream>
#include<vector>
using namespace std;

  int val = as<int>(y);
  NumericVector xx(x);
  NumericVector::iterator iter;
  int m = 0;

  for(iter = xx.begin(); iter < xx.end(); iter++){
    if(*iter == val) ++m;}

  return(wrap(m));
'
countf <- cxxfunction(signature(x = "numeric", y = "numeric"),
                      body = countRcpp,
                      plugin = "Rcpp")

set.seed (1005) # set seed for sampling
x <- sample(1:5L, size = 10, replace = T) #L is Long integer. Keep the nunmber as integer. 
x # [1] 1 3 1 3 3 4 1 3 1 2
y <- 3L
y
countf(x,y) 


incl <- '
#include<iostream>
#include <algorithm>  
#include <vector> 
using namespace std;

  template <typename S_Type, typename T>
  typename iterator_traits<S_Type>::difference_type 

  S_Type countR(S_Type first, S_Type last, const T & val){
    typename iterator_traits<S_Type>::difference_type ret=0;
    while (first !=last){
    if(*first == val) ++ret;
    ++first;
    }
  return ret;
  }
'
body_count <- '
#include<iostream>
#include<vector>
#include <algorithm>    

using namespace std;

  NumericVector xx(x);
  int n = xx.size();
  NumericVector yy = xx + n;
  int val = as<int>(y);
  int pos = countR(xx, yy, val);
  return wrap(pos);
'
countRcpp3 <- cxxfunction(signature(x = "numeric", y = "numeric"),
              body = body_count,
              includes = incl,
              plugin = "Rcpp")

何か提案をお願いします。または、このタスクで他の論理をお勧めしますか?前もって感謝します。

ラルフ・スタブナー

最初のステップとして、署名付きの関数を抽出できます

int foo(Rcpp::IntegerVector x, int val)

作業コードから。次に、これを一般化して、任意の反復可能な型に作用させることができます。署名:

template <typename T>
int foo(T x, typename std::iterator_traits<typename T::iterator>::value_type val) 

ただし、これをRから呼び出すことはできません。Rの関数が異なる型で動作する必要がある場合は、SEXP引数として使用する必要があります。TYPEOF()次に、Rデータ型を決定するために使用できます。これを整数ベクトルにまとめると:

#include <Rcpp.h>

template <typename T>
int iter_count(T x, typename std::iterator_traits<typename T::iterator>::value_type val) { 
  int m = 0;

  for(typename T::iterator iter = x.begin(); iter < x.end(); ++iter) {
    if(*iter == val) ++m;
 }

  return m;
}


// [[Rcpp::export]]
int count(SEXP x, SEXP val) {
  switch( TYPEOF(x) ) {
  case INTSXP: {
    return iter_count(Rcpp::as<Rcpp::IntegerVector>(x),
              Rcpp::as<Rcpp::IntegerVector>(val)(0));
  }
  default: {
    Rcpp::stop("incompatible SEXP encountered");
  }
  }  
}


/*** R
set.seed (1005)
x <- sample(1:5L, size = 10, replace = T)
y <- 3L
count(x,y) 
*/

ここではRcpp属性.cppを使用Rcpp::sourceCpp("...")しています。これをファイルとして保存して使用します。

ところで、あなたのコードでは、これは怪しいように見えます:

  NumericVector xx(x);
  int n = xx.size();
  NumericVector yy = xx + n;

のエンドポイントが必要xxですか?次に、xx.end()またはを使用しますend(xx)これはではありませんNumericVectorあなたのコードは、NumericVectorのコンテンツがxxのサイズによってインクリームされた新しいものを作成しますxxここでは、Rcpp属性を使用した同等のコードを示します。

Rcpp::cppFunction('NumericVector foo(NumericVector xx) {
  int n = xx.size();
  NumericVector yy = xx + n;
  return yy;
}
')

set.seed(42)
foo(runif(3))
# [1] 3.914806 3.937075 3.286140

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ソートアルゴリズムのカウントにおける要素のカウントの減少

分類Dev

マージソートアルゴリズムのスワップ/比較数をカウントする

分類Dev

挿入ソートアルゴリズムインプレースおよびループバリアント

分類Dev

カレンダーイベントの視覚化。イベントを最大幅でレイアウトするアルゴリズム

分類Dev

新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

分類Dev

C ++テンプレートを使用して戦略/アルゴリズムを切り替える

分類Dev

テンプレートを使用してmd5ハッシュアルゴリズムを構築する

分類Dev

mochiwebパーサーを使用して画像のサイズをカウントしないアルゴリズム

分類Dev

大きなカーディナリティをカウントするためのLogLogおよびHyperLogLogアルゴリズム

分類Dev

単一のテンプレート変数によって複数回呼び出されたMeteorヘルパー

分類Dev

このアルゴリズムでプリミティブ操作をカウントするにはどうすればよいですか?

分類Dev

パンダのデータフレームをカテゴリカルからカウントに再形成

分類Dev

C関数呼び出しによって生成されたアセンブリを理解する

分類Dev

Pythonのマージソートアルゴリズムでスワップをカウントするにはどうすればよいですか?

分類Dev

Cからluaスクリプトによって返される関数を呼び出す

分類Dev

エクスポートされたRcpp関数によって呼び出される別のC ++関数の引数としてC ++関数を使用します

分類Dev

範囲アルゴリズム内の数値をカウントする(C ++)

分類Dev

マージソートを使用しない反転カウントアルゴリズム(c ++)

分類Dev

クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

分類Dev

何が、アルゴリズム解析の比較としてカウント?

分類Dev

Merge_Sortアルゴリズムの作業をカウントする

分類Dev

AVLツリー内のノード数をカウントするアルゴリズム

分類Dev

データフレーム内のカテゴリ機能のレベルをカウントする

分類Dev

C#プログラムによって呼び出されるCobolプログラムでCobolまたはC関数を呼び出す

分類Dev

パーセプトロントレーニングアルゴリズムを理解する

分類Dev

WooCommerceループカテゴリカウントにテキストを追加

分類Dev

関数によって返される呼び出しプロシージャ

分類Dev

UseMethodによって呼び出されるメソッドのスコープ

分類Dev

Firebaseの呼び出しによってトリガーされるアクティビティをエスプレッソに待機させる方法は?

Related 関連記事

  1. 1

    ソートアルゴリズムのカウントにおける要素のカウントの減少

  2. 2

    マージソートアルゴリズムのスワップ/比較数をカウントする

  3. 3

    挿入ソートアルゴリズムインプレースおよびループバリアント

  4. 4

    カレンダーイベントの視覚化。イベントを最大幅でレイアウトするアルゴリズム

  5. 5

    新しいアイテムを挿入してカテゴリアイテムをカウントするアルゴリズム

  6. 6

    C ++テンプレートを使用して戦略/アルゴリズムを切り替える

  7. 7

    テンプレートを使用してmd5ハッシュアルゴリズムを構築する

  8. 8

    mochiwebパーサーを使用して画像のサイズをカウントしないアルゴリズム

  9. 9

    大きなカーディナリティをカウントするためのLogLogおよびHyperLogLogアルゴリズム

  10. 10

    単一のテンプレート変数によって複数回呼び出されたMeteorヘルパー

  11. 11

    このアルゴリズムでプリミティブ操作をカウントするにはどうすればよいですか?

  12. 12

    パンダのデータフレームをカテゴリカルからカウントに再形成

  13. 13

    C関数呼び出しによって生成されたアセンブリを理解する

  14. 14

    Pythonのマージソートアルゴリズムでスワップをカウントするにはどうすればよいですか?

  15. 15

    Cからluaスクリプトによって返される関数を呼び出す

  16. 16

    エクスポートされたRcpp関数によって呼び出される別のC ++関数の引数としてC ++関数を使用します

  17. 17

    範囲アルゴリズム内の数値をカウントする(C ++)

  18. 18

    マージソートを使用しない反転カウントアルゴリズム(c ++)

  19. 19

    クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

  20. 20

    何が、アルゴリズム解析の比較としてカウント?

  21. 21

    Merge_Sortアルゴリズムの作業をカウントする

  22. 22

    AVLツリー内のノード数をカウントするアルゴリズム

  23. 23

    データフレーム内のカテゴリ機能のレベルをカウントする

  24. 24

    C#プログラムによって呼び出されるCobolプログラムでCobolまたはC関数を呼び出す

  25. 25

    パーセプトロントレーニングアルゴリズムを理解する

  26. 26

    WooCommerceループカテゴリカウントにテキストを追加

  27. 27

    関数によって返される呼び出しプロシージャ

  28. 28

    UseMethodによって呼び出されるメソッドのスコープ

  29. 29

    Firebaseの呼び出しによってトリガーされるアクティビティをエスプレッソに待機させる方法は?

ホットタグ

アーカイブ