2013-10-19 14 views
5

का उपयोग करके रिकर्सन के लिए न्यूमेरिक वेक्टर में तत्व को कैसे निकालें I आर के लिए आरसीपीपी पैकेज का उपयोग करने के बारे में और जानने के लिए प्रयास कर रहा था। इसलिए मैंने आरसीपीपी का उपयोग करके मूल सॉर्टिंग एल्गोरिदम का परीक्षण करना शुरू किया। मैं हैडली विकम ट्यूटोरियल here में शुरू कर रहा था।आर और आरसीपीपी

मैं सफलतापूर्वक प्रविष्टि प्रकार रिकर्सिवली इस तरह से लागू किया:

cppFunction(" 
    NumericVector insertionsortRC(NumericVector vetor) { 
     int n = vetor.size(); 

     double aux; 
     int i; 

     if(n>1) { 
      vetor.erase(n-1); 
      insertionsortRC(vetor); 
      aux=vetor[n-1]; 
      i=n-1; 
      while(vetor[i-1]>aux && i>=0) { 
       vetor[i]=vetor[i-1]; 
       i--; 
       } 
      vetor[i]=aux; 
      } 

     return vetor; 
     } 
    ") 

मुझे लगता है कि erase एक अच्छा विचार यहाँ नहीं था:

library(Rcpp) 

vetor<-sample(100) 
vetor 
cppFunction(" 
    NumericVector insertionsortRC(NumericVector vetor, int n) { 
     double aux; 
     int i; 

     if(n>1) { 
      insertionsortRC(vetor,n-1); 
      aux=vetor[n-1]; 
      i=n-1; 
      while(vetor[i-1]>aux && i>=0) { 
       vetor[i]=vetor[i-1]; 
       i--; 
       } 
      vetor[i]=aux; 
      } 

     return vetor; 
     } 
    ") 

लेकिन समारोह 2 तर्कों के लिए पूछना है, तो मैं इस तरह से करने की कोशिश की , ऐसा लगता है कि मैं स्मृति से तत्व मिटा देता हूं और रिकर्सन कॉल के बाद इसे बाद में पुनर्प्राप्त नहीं कर सकता। मैंने सोचा कि समस्या vetor.erase (एन -1) पर हो सकती है; लाइन, vetor.erase (एन) की कोशिश की; और यह संकलित, लेकिन बिल्कुल काम नहीं किया।

vetor.erase (n) के साथ;

insertionsortRC (Vetor) * `में/usr/lib/आर/bin/कार्यकारी/आर 'त्रुटि: malloc(): स्मृति भ्रष्टाचार: 0x098db548 *

मैं आर में निम्न त्रुटि मिला

vetor.erase (n-1) के साथ;

insertionsortRC (Vetor) [1] 3.607393e-313 3.300000e + 01 + 01 3.100000e 8.600000e + 01 + 01 2.500000e 7.000000e + 01 [7] 4.000000e: यह एक अजीब उत्पादन मिला +01 8.800000e + 01 8.100000e + 01 1.300000e + 01 8.500000e + 01 8.700000e + 01 [13] 3.900000e + 01 6.000000e + 01 6.400000e + 01 1.000000e + 01 8.200000e + 01 8.900000e + 01 [1 9] 1.400000e + 01 6.600000e + 01 3.600000e + 01 1.500000e + 01 9.600000e + 01 2.600000e + 01 [25] 4.000000e + 00 5.400000e + 01 2.900000e + 01 8.300000e + 01 5.500000e +01 6.800000e + 01 [31] 9.100000e + 01 6.000000e + 00 1.000000e + 02 5.100000e + 01 7.000000e + 00 5.300000e + 01 [37] 9.900000e + 01 6.500000e + 01 2.300000e + 01 9 .400000e + 01 5.700000e + 01 9.000000e + 01 [43] 3.200000e + 01 4.700000e + 01 1.600000e + 01 5.000000e + 01 2.800000e + 01 3.000000e + 00 [4 9] 9.800000e + 01 1.100000e +01 1.800000e + 01 7.600000e + 01 6.300000e + 01 7.700000e + 01 [55] 7.400000e + 01 4.900000e + 01 8.000000e + 00 9.700000e + 01 1.200000e + 01 2.700000e + 01 [61] 3.500000e + 01 7.900000e + 01 8.000000e + 01 2.000000e + 01 6.700000e + 01 9.300000e + 01 [67] 5.000000e + 00 5.600000e + 01 9.000000e + 00 3.700000e + 01 2.400000e + 01 9.200000e +01 [73] 6.900000e + 01 3.800000e + 01 4.400000e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [7 9] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [ 91] 8.400000e + 01 + 01 4.800000e 7.800000e + 01 + 01 7.300000e 3.000000e + 01 + 01 5.900000e [97] 5.800000e + 01 + 01 5.200000e 7.500000e + 01

सकता है कोई मुझे बताएं कि: 01. क्या इस कोड को इस तरह कार्यान्वित करना संभव है, आरसीपीपी और आर का उपयोग करके, फ़ंक्शन को केवल एक तर्क के साथ कॉल करना, डेटा का वेक्टर? 02. इसे सही तरीके से कैसे करें?

उत्तर

5

संक्षेप में:

  1. अच्छी खबर यह है कि आप अपने संकलन काम कर रहे है कि है।

  2. इतनी अच्छी खबर segfault नहीं है। आपके कोड में एक तर्क त्रुटि की संभावना है।

  3. सामान्य रूप से, न्यूमेरिक वेक्टर आदि को जोड़ना या निकालना खराब विचार है। ये उथले प्रकार हैं जो सीधे उसी ऑब्जेक्ट की आर मेमोरी ("कोई प्रतियां") से कनेक्ट नहीं होते हैं। इसका मतलब है विस्तार या निकालना महंगा है। एक एसटीएल std::vector<double> का उपयोग करने पर विचार करें। यह सब दस्तावेज है।

3

कुछ बातें:

vetor.erase(n) अपरिभाषित व्यवहार है। पहली अनुक्रमणिका 0 है, अंतिम n-1 है। erase सीमा शुल्क नहीं करता है क्योंकि हर किसी को कीमत चुकानी पड़ेगी। इसके बजाए यह मानता है, क्योंकि यह सी ++ दुनिया में आम है कि फ़ंक्शन का सही ढंग से उपयोग किया जाता है।

std::sort के बारे में जानें। यह घर समर्थित प्रकार के कार्यान्वयन, विशेष रूप से सम्मिलन प्रकार की तुलना में अधिक कुशल होने की संभावना है।

Rcpp वैक्टर एक sort विधि है। तो NumericVector स्वयं को सॉर्ट कर सकता है।

गुणों के बारे में जानें, यानी Rcpp-attributes विग्नेट के साथ, यह उपयोग करने में आसान है और यह आपको डिफ़ॉल्ट तर्कों से निपटने का एक तरीका देगा।

0

प्रयास करें: vector.erase(vector.begin()+desiredElement)

कि आपकी समस्या का ध्यान रखना चाहिए।

न्यूमेरिक वेक्टर प्रकार कम से कम std::vector से संबंधित होता है, जिस तरह से यह डेटा सम्मिलन और डेटा को हटाने के तरीके से होता है, जिसका अर्थ है कि आपको इसे इटरेटर का उपयोग करना है (हालांकि, मैं आरसीपीपी गुरु नहीं हूं)।

ब्रायन

संबंधित मुद्दे