Ich bin ein Anfänger mit Rcpp. Zur Zeit habe ich einen Rcpp-Code geschrieben, der auf zwei 3-dimensionalen Arrays angewendet wurde: Array1
und Array2
. Angenommen, Array1
hat Dimension (1000, 100, 40) und Array2
hat Dimension (1000, 96, 40).Rcpp Programmierung Effizienz
Ich möchte wilcox.test
ausführen mit:
wilcox.test(Array1[i, j,], Array2[i,,])
In R, ich verschachtelt schrieb for
Schleifen, die die Berechnung in etwa einer halben Stunde abgeschlossen.
Dann schrieb ich es in Rcpp. Die Berechnung in Rcpp dauerte eine Stunde, um die gleichen Ergebnisse zu erzielen. Ich dachte, es sollte schneller sein, da es in C++ geschrieben ist. Ich denke, dass meine Art der Codierung die Ursache für die geringe Effizienz ist.
Das Folgende ist mein Rcpp-Code, würde es Ihnen etwas ausmachen, mir zu helfen, herauszufinden, welche Verbesserung ich bitte machen sollte? Ich schätze es!
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector Cal(NumericVector Array1,NumericVector Array2,Function wilc) {
NumericVector vecArray1(Array1);
IntegerVector arrayDims1 = vecArray1.attr("dim");
NumericVector vecArray2(Array2);
IntegerVector arrayDims2 = vecArray2.attr("dim");
arma::cube cubeArray1(vecArray1.begin(), arrayDims1[0], arrayDims1[1], arrayDims1[2], false);
arma::cube cubeArray2(vecArray2.begin(), arrayDims2[0], arrayDims2[1], arrayDims2[2], false);
arma::mat STORE=arma::mat(arrayDims1[0], arrayDims1[1]);
for(int i=0;i<arrayDims1[1];i++)
{
for(int j=0;j<arrayDims1[0];j++){
arma::vec v_cl=cubeArray1.subcube(arma::span(j),arma::span(i),arma::span::all);
//arma::mat tem=cubeArray2.subcube(arma::span(j),arma::span::all,arma::span::all);
//arma::vec v_ct=arma::vectorise(tem);
arma::vec v_ct=arma::vectorise(cubeArray2.subcube(arma::span(j),arma::span::all,arma::span::all));
Rcpp::List resu=wilc(v_cl,v_ct);
STORE(j,i)=resu[2];
}
}
return(Rcpp::wrap(STORE));
}
Die Funktion wilc
wird wilcox.test
von R sein.
Das folgende ist ein Teil meiner R Code für die obige Idee der Umsetzung, wo CELLS
und CTRLS
sind zwei 3D-Array in R.
for(i in 1:ncol(CELLS)) {
if(T){ print(i) }
for (j in 1:dim(CELLS)[1]) {
wtest = wilcox.test(CELLS[j,i,], CTRLS[j,,])
TSTAT_clcl[j,i] = wtest$p.value
}
}
Der Aufruf von R ++ in jeder Schleife ist ... ziemlich genau so wie das Schreiben in R. Sie hatten die falsche Ausgangsannahme: die Schleifen, die Sie umgeschrieben haben, waren nicht der Flaschenhals. Das nächste Mal, vielleicht Profil zuerst. –
Hallo @DirkEddelbuettel, danke für deinen Kommentar! Ich habe es in R mit foreach umgeschrieben und benutze doSNOW, um Code parallel zu implementieren. Bei einem Array von 1000 * 100 * 40 dauert es 18 Minuten, um ein Ergebnis zu erhalten. Es ist jedoch immer noch nicht ideal. Es ist eine Herausforderung für jemanden, der nicht über Informatikwissen wie mich verfügt, um die Leistung des Codes zu verbessern. Jedenfalls finde ich es auch interessant! –