2016-12-21 3 views
0

Ist es möglich, eine Matrix zu durchlaufen und einige Teilmengen zu analysieren?Rcpp Loop und Subset Numerische Matrix

In R:

for(i in 10:nrow(mat)){ 
    hist = mat[(i-5):(i),] 
    // Do something 
} 

In dem obigen Beispiel R, mir Schleifen die mat Matrix vom 10. Reihe zu seiner letzten Reihe. Bei jeder Iteration unterteile ich die letzten 5 Observationen und tue etwas.

Ist das in Rcpp möglich? Das folgende Beispiel ist etwas, was ich versuchte ..

int n_col = sample_data.ncol(); 
    int n_row= sample_data.nrow(); 
    int max_lb = 10; 
    for(int i=(max_lb+1); i<n_row; i++) { 

    SubMatrix<REALSXP> res = sample_data(Range(i-max_lb,i),Range(0,n_col)); 
    //NumericMatrix hist = res; //If this is uncommented, it fails when I run it...it pretty much just freezes after some iteration... 
    Rcpp::Rcout << "-----------------------------" <<std::endl; 
    Rcpp::Rcout << i << "\n" <<std::endl; 
    Rcpp::Rcout << res .nrow() <<std::endl; // Dimensions do not match what I have 
    Rcpp::Rcout << res .ncol() <<std::endl; 
    } 

In der Zeile //NumericMatrix hist = res;, ich versuche, es zu konvertieren zurück NumericMatrix zu geben, aber es funktioniert nicht.

+1

Bitte gehen Sie in die [Rcpp Gallery] (http://gallery.rcpp.org) und schauen Sie sich das Teilbeispiel an, um diese Frage zu beantworten. Kurz gesagt: _sure! _ –

Antwort

4

Es gibt keinen Grund SubMat<> hier zu verwenden, wird das Ergebnis der Teilmenge Operation NumericMatrix direkt konvertieren:

#include <Rcpp.h> 

// [[Rcpp::export]] 
void submat(Rcpp::NumericMatrix x, int max_lb = 10) { 
    int n_col = x.ncol(); 
    int n_row = x.nrow(); 

    for (int i = max_lb + 1; i < n_row; i++) { 
     Rcpp::NumericMatrix res = 
      x(Rcpp::Range(i - max_lb, i), Rcpp::Range(0, n_col - 1)); 

     std::printf(
      "i = %d: [%d x %d]\n", 
      i, res.nrow(), res.ncol() 
     ); 
    } 
} 

submat(matrix(1:40, 20)) 
# i = 11: [11 x 2] 
# i = 12: [11 x 2] 
# i = 13: [11 x 2] 
# i = 14: [11 x 2] 
# i = 15: [11 x 2] 
# i = 16: [11 x 2] 
# i = 17: [11 x 2] 
# i = 18: [11 x 2] 
# i = 19: [11 x 2] 

Was, warum

es ziemlich nach einigen gefriert es einfach

menarbeit

geschah, haben Sie eine außerhalb der Grenzen Zugang hier

sample_data(Range(i-max_lb,i),Range(0,n_col)); 
//       ^^^^^^^^^^^^^^^^ 

die undefinierten Verhalten ist. Und Sie könnten sagen, "Ja, aber es war die nächste Linie, die mein Programm zum Einfrieren", aber das ist nicht wirklich wahr. Sie haben etwas Illegales in der vorherigen Zeile gemacht und aus welchem ​​Grund auch immer, in der auskommentierten Zeile haben Sie "bezahlt".

Verwandte Themen