2011-06-22 17 views
7

मैं एक रेट्रेटर लागू कर रहा हूं, और मैं नमूने लागू करने के बीच में हूं। एक नमूना एक वर्ग x = 0: 1, y = 0: 1 पर यादृच्छिक बिंदुओं का जनरेटर है। प्रत्येक नमूने में "यादृच्छिक" नमूने के कई सेट होते हैं, और प्रत्येक सेट में नमूनों की एक निर्दिष्ट संख्या होती है।शफलिंग और एनआरयूक्स बाधा संरक्षण

अब, नमूने में से एक एनआरयूक्स है। यह n x n ब्लॉक में सतह को विभाजित करता है, प्रत्येक विकर्ण ब्लॉक में विकर्ण के साथ ब्लॉक चुनता है, एक यादृच्छिक बिंदु निकालता है, और आखिरकार x स्वयं को y में घुमाता है।

enter image description here

यह सब अच्छे और साफ है। हालांकि, जब अंक निकालने का समय आता है, तो मैं जिस पुस्तक का अनुसरण कर रहा हूं वह बाद के पिक्सल और नमूने के बीच सहसंबंध को तोड़ने के लिए इन अतिरिक्त आवश्यकताओं का प्रस्ताव करता है। पहली आवश्यकता यह है कि हर बार एक सेट समाप्त हो जाता है, यादृच्छिक रूप से एक नया नमूना सेट उठाया जाता है।

Point2D Sampler::sample_unit_square(void) { 
    if (count % num_samples == 0) jump = (rand_int() % num_sets) * num_samples; 
    return (samples[jump + count++ % num_samples] 
} 

जहां samples आकार num_samples*num_sets की Point2D का एक वेक्टर है (यह linearized है): कोड इस लक्ष्य को हासिल करने के लिए लागू निम्नलिखित है। प्रत्येक बार एक पिक्सेल किया जाता है (गिनती num_samples द्वारा विभाजित होती है) एक नई छलांग निकाली जाती है और एक नए सेट की शुरुआत के लिए रैखिक सरणी को इंगित करने के लिए उपयोग की जाती है।

def __iter__(self): 

    while True: 
     for sample_set in random.choice(self._samples_sets): 
      for sample in sample_set: 
       yield sample 

यह तुच्छ है, और ठीक काम करता है:

जब से मैं अजगर उपयोग कर रहा हूँ, मेरी रणनीति iterators का उपयोग करता है।

दूसरी आवश्यकता इंडेक्स को घुमाने के लिए है, और यहां मेरा सवाल है। के रूप में

Point2D Sampler::sample_unit_square(void) { 
    if (count % num_samples == 0) jump = (rand_int() % num_sets) * num_samples; 
    return (samples[jump + shuffled_indices[ jump + count++ % num_samples]] 
} 

जहां फेरबदल सूचकांक एक सरणी अभिकलन के रूप में

void Sampler::setup_shuffled_indices(void) { 
    shuffled_indices.reserve(num_samples*num_sets); 
    vector<int> indices; 

    for (int j=0; j<num_samples; j++) indices.push_back(j); 

    for (int p=0; p<num_sets; p++) { 
      random_shuffle(indices.begin(), indices.end()); 
      for (int j=0; j<num_samples; j++) { 
       shuffled_indices.push_back(indices[j]); 
      } 
    } 
} 

जो 1 से n करने के लिए नंबरों की सूची लेने और उन्हें फेरबदल का एक बहुत ही सी ++ तरीका है इस प्रकार है इस प्रकार पुस्तक कोड में संशोधन। मुझे लगता है मैं भी एक यादृच्छिक इटरेटर कि सेट पर दोहराता, सूची प्रतिलिपि सहेजने को लागू कर सकता है अजगर

def __iter__(self): 

    while True: 
     sample_set = random.choice(self._samples_sets): 
     shuffled_set = sample_set[:] 
     random.shuffle(shuffled_set) 
     for sample in shuffled_set: 
      yield sample 

में निम्न कोड लागू करने के लिए चाहता था, लेकिन इस बिंदु नहीं है। मेरा प्रश्न किताब में निम्नलिखित वाक्यांश से उत्पन्न होती है:

... एक और संभावना [सहसंबंध दूर करने के लिए] प्रत्येक सेट के नमूने पर अंतिम फेरबदल उपयोग करने के लिए है, लेकिन यह नष्ट कर देता है एन-किश्ती हालत [। ..]। सबसे अच्छा तरीका प्रत्येक सेट के लिए sample_unit_square में उपयोग किए गए इंडेक्स को यादृच्छिक रूप से शफल करना है, लेकिन गारंटी है कि सभी नमूने उपयोग किए जाते हैं।

जो मुझे समझ में नहीं आता है: यह क्यों कहता है कि प्रत्येक सेट के नमूने पर अंतिम शफल एन-रुक तोड़ता है? मुद्दा यह है कि वह बिंदुओं की सरणी में अप्रत्यक्ष अनुक्रमण का उपयोग कर रहा है। यह अप्रत्यक्ष सूचकांक सभी सूचकांकों को 1 से लेकर सेटों की संख्या में बदलने के लिए बनाया गया है, लेकिन यह प्रत्येक सेट में सभी नमूनों पर एक शफल के बराबर है। आईएमएचओ समकक्ष होने के नाते, मुझे नहीं पता कि पहले फॉर्मूलेशन को एन-रुक क्यों तोड़ना चाहिए और दूसरा क्यों नहीं।

रिकॉर्ड के लिए पुस्तक, केविन सफ़र्न द्वारा "रे ट्रेसिंग द ग्राउंड अप" है।

+0

ऐसा लगता है कि लेखक संयोजन के बारे में उलझन में है। उदाहरण के लिए, जब एक एन-रुक व्यवस्था का निर्माण करते हैं, तो क्यों * एक्स * वाई * पर shuffle? एक्स पर शफलिंग पहले से ही सभी एन तक पहुँचता है! रुकों की व्यवस्था; वहां भी शफल करने की आवश्यकता नहीं होनी चाहिए। –

+0

क्या यह संभव है कि लेखक पूरे सेट को घुमाए, न केवल सूचकांक? यानी सभी 16 बक्से को घुमाने के लिए उपरोक्त 4x4 उदाहरण के साथ? वह एन-रुक को नष्ट कर देगा ... – tugs

+0

@ टग्स: मुझे यह कारण नहीं दिख रहा है कि इसे क्यों करना चाहिए। शफलिंग, या इंडेक्स इंडिकेशन का उपयोग करके, सिर्फ एक बिंदु को दूसरे से बाहर आने की अनुमति देता है। यह बोर्ड पर अंक के वितरण को नहीं बदलता है। –

उत्तर

1

यह

की तरह मुझे लग रहा है ... प्रत्येक सेट के नमूने पर अंतिम फेरबदल का उपयोग ..

शफ़ल करने के लिए प्रत्येक स्वतंत्र रूप से सेट करने के बाद सेट shuffled हैं सुझाव दे रहा है।

def __iter__(self): 

    while True: 
     for sample_set in random.choice(self._samples_sets): 
      for sample in random.choice(sample_set): 
       yield sample 

ऐसा ही। मैं पाइथन विशेषज्ञ नहीं हूं इसलिए किसी कोड त्रुटि को क्षमा करें। यह एन-रुक तोड़ देगा, हालांकि यह एक बुरा विचार हो सकता है। यह इस बात पर निर्भर करता है कि आप किसके लिए जा रहे हैं।

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