2012-12-08 17 views
11

मैं आरसीपीपी में NumericVector में कैसे आकार बदल सकता हूं?एक न्यूमेरिक वेक्टर का आकार कैसे बदलें?

जब मैं push_back फ़ंक्शन का उपयोग करता हूं, तो प्रोग्राम धीमा हो जाता है। लेकिन .resize() या .reserve() फ़ंक्शंस नहीं हैं। (जब मैं पहले से ही वांछित आकार के साथ एक NumericVector है, मैं कॉपी-निर्माता का उपयोग कर सकते NumericVector का सही आकार पाने के लिए। इस तरह के एक मामले push_back के उपयोग की तुलना में बहुत तेजी से है)

+0

के रूप में एक प्रकार की कटार समझाया के माध्यम से लागू कर सकते हैं, वहाँ बहुत कम मौका है कि हम एक होगा 'आरक्षित 'विधि। हम 'आकार बदलना' लागू कर सकते हैं। –

उत्तर

17

यदि आप चाहें, सी ++ मुहावरे, std::vector<double> का उपयोग करें और अंत में इसे वापस करें जहां इसे एक आर वेक्टर में एक अंतर्निहित wrap() के माध्यम से परिवर्तित किया जाएगा। आप आरपीपीएआरडमिलिलो और आरपीपीईजेन के माध्यम से आर्मडिलो या ईजिन वैक्टर का भी उपयोग कर सकते हैं।

हमारी ऑब्जेक्ट्स आर ऑब्जेक्ट के चारों ओर उथले रैपर हैं, इसलिए push_back कहें, Rcp::NumericVector को हमेशा एक पूर्ण प्रति की आवश्यकता है। यह ज्ञात और दस्तावेज है।

संपादित करें: तो संपूर्णता के लिए, यहां एक उदाहरण RcppArmadillo उपयोग कर रहा है:

// [[Rcpp::depends(RcppArmadillo)]] 
#include <RcppArmadillo.h> 

// [[Rcpp::export]] 
arma::vec shrink(arma::vec x) { 
    arma::vec y = x; 
    y.resize(y.size()-2); 
    return y; 
} 

जो हम

R> Rcpp::sourceCpp('/tmp/vec.cpp') 
R> shrink(1:10) 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
R> 
संबंधित मुद्दे