2017-01-31 16 views
6

में पंक्तिसमूहों की गणना कैसे करें मैं आरसीपीपी में आर फ़ंक्शन को परिवर्तित कर रहा हूं, जहां मैंने आर फ़ंक्शन rowSums का उपयोग किया है, जो आरसीपीपी में मान्य चीनी अभिव्यक्ति नहीं है। मुझे rowSums here के आरसीपीपी संस्करण के लिए कोड मिला। जब मैं अपने मुख्य Rcpp समारोह में rowSumsC() का उपयोग लेकिन मैंआरसीपीपी

error: use of undeclared identifier

हो रही है।

क्या कोई आसान फिक्स है?

संपादित करें: कोड

cppFunction(
    "NumericMatrix Expcpp(NumericVector x, NumericMatrix w, 
    NumericVector mu, NumericVector var, NumericVector prob, int k) { 
    for (int i=1; i<k; ++i){ 
    w(_,i) = prob[i] * dnorm(x,mu[i], sqrt(var[i])); 
    } 
    w = w/rowSums(w) 
    return w; 
}") 
+1

कृपया एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण (जैसे पद कोड और कॉल) बना सकते हैं। इसके अलावा, 'rowSums' के बराबर एक आरसीपीपी चीनी है। इसे आरसीपीपी 0.12.8 – coatless

+0

में जोड़ा गया था मैंने कोड अपलोड किया है। मैं वास्तव में इसे कॉल नहीं कर सकता क्योंकि इसे परिभाषित नहीं किया जा सकता है क्योंकि पंक्तियों की पहचान नहीं की जा रही है। RowSums के समतुल्य आरसीपीपी का नाम क्या है और क्या मुझे इसे कॉल करने के लिए अतिरिक्त कुछ करना है? मैं वास्तव में आरसीपीपी के लिए नया हूँ। –

उत्तर

6

Rcpp officially added rowSum support in 0.12.8। इसलिए, उन्नत आर

में हेडली द्वारा तैयार किए गए rowSumsC फ़ंक्शन का उपयोग करने की कोई आवश्यकता नहीं है, यह कहकर, कोड के साथ कुछ समस्याएं हैं।


Rcpp वर्तमान नहीं समर्थन MatrixVector करने के लिए या MatrixMatrix संगणना के लिए करता है। (बाद में समर्थन #583 में जोड़ा जा सकता है, हालांकि यदि आवश्यक हो तो RcppArmadillo या RcppEigen का उपयोग करने पर विचार करना चाहिए)। इसलिए, निम्न पंक्ति समस्याग्रस्त है:

w = w/rowSums(w) 

इसका समाधान करने के लिए, पहले rowSums गणना और फिर मैट्रिक्स एक पारंपरिक for पाश का उपयोग कर मानकीकरण। नोट: सी ++ में लूपिंग आर के विपरीत बहुत तेज है।

NumericVector summed_by_row = rowSums(w); 

for (int i = 0; i < k; ++i) { 
    w(_,i) = w(_,i)/summed_by_row[i]; 
} 

इसके बाद, सी ++ सूचकांक 0 नहीं 1 पर शुरू करते हैं। इसलिए, पाश के लिए निम्नलिखित समस्याग्रस्त है:

for (int i=1; i<k; ++i) 

ठीक:

for (int i=0; i<k; ++i) 

अन्त में, समारोह के मापदंडों मूल्यों के कुछ अप्रासंगिक हैं या अधिरोहित कर रहे हैं के रूप में कम किया जा सकता । एक साथ उपर प्रतिक्रिया के सभी लाना

NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) { 

    int n = x.size(); 
    int k = mu.size(); 
    NumericMatrix w = no_init(n,k); 

    ..... 

, हम वांछित समारोह मिलती है:

NumericMatrix Expcpp(NumericVector x, NumericMatrix w, 
    NumericVector mu, NumericVector var, NumericVector prob, int k) 

करने के लिए:

समारोह घोषणा से चला जाता है।

Rcpp::cppFunction(
    'NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) { 

    int n = x.size(); 
    int k = mu.size(); 

    NumericMatrix w = no_init(n,k); 

    for (int i = 0; i < k; ++i) { // C++ indices start at 0 
    w(_,i) = prob[i] * dnorm(x, mu[i], sqrt(var[i])); 
    } 

    Rcpp::Rcout << "Before: " << std::endl << w << std::endl; 

    NumericVector summed_by_row = rowSums(w); 

    Rcpp::Rcout << "rowSum: " << summed_by_row << std::endl; 

    // normalize by column to mimic R 
    for (int i = 0; i < k; ++i) { 
    w(_,i) = w(_,i)/summed_by_row[i]; 
    } 

    Rcpp::Rcout << "After: " << std::endl << w << std::endl; 

    return w; 
    }') 

set.seed(51231) 
# Test values 
n <- 2 
x <- seq_len(n) 
mu <- x 
var <- x 
prob <- runif(n) 

mat <- Expcpp(x, mu, var, prob) 

आउटपुट

Before: 
0.0470993 0.125384 
0.0285671 0.160996 

rowSum: 0.172483 0.189563 
After: 
0.273066 0.661436 
0.165623 0.849300 
संबंधित मुद्दे