असंरचित ग्रिड के लिए कुशल प्रक्षेप विधि?


12

मैं दो असंरचित ग्रिडों के बीच डेटा को प्रक्षेपित करने के लिए एक अच्छी विधि जानना चाहूंगा, जहां एक ग्रिड दूसरे का एक मोटे संस्करण है।

दक्षता मेरे लिए बहुत महत्वपूर्ण है क्योंकि मैं एक क्षणिक पीडीई समस्या हल कर रहा हूं जहां मुझे समाधान के हर चरण में ग्रिड के बीच डेटा स्थानांतरित करने की आवश्यकता है।

मैंने किसी दिए गए बिंदु के निकटतम नोड की खोज के लिए केडी-ट्री का उपयोग करने के बारे में सोचा, फिर मैं डेटा को प्रक्षेपित करने के लिए उस तत्व (FEM सिमुलेशन) के आकार कार्यों का उपयोग करूंगा। क्या यह एक अच्छा उपाय है? क्या बेहतर हैं?

क्या आप इस कार्य के लिए C / C ++ में कोई मजबूत और विश्वसनीय पुस्तकालय भी जानते हैं?

* मुझे पता है कि एक समान प्रश्न है, लेकिन यह एक संरचित ग्रिड पर सबसे सटीक विधि के लिए पूछता है।


इस प्रश्नोत्तर को देखें, मैंने इसके लिए ओपन-सोर्स विधियों का गुच्छा एकत्र किया: scicomp.stackexchange.com/questions/19137/…
denfromufa

जवाबों:


6

असंरचित ग्रिड का अपना स्थान है।

आप अर्थ सिस्टम मॉडलिंग फ्रेमवर्क (ESMF) को देखना चाहते हैं। उनके पास फिर से ग्रिडिंग के लिए कुछ कोड हैं - विशेष रूप से इस उद्देश्य के लिए - और उन्होंने समानांतर कोड के साथ कुछ निफ्टी सामान भी किया है। पूरे सिस्टम को युगल मॉडल के लिए डिज़ाइन किया गया है, इसलिए वहां अन्य उपयोगी सामान भी हो सकते हैं।

कुछ अन्य नोट:

"किसी भी महत्वपूर्ण संख्या के लिए कुशलतापूर्वक ऐसा करने का कोई तरीका नहीं"

अच्छी तरह से, कुशल एक सापेक्ष चीज है - एक बार जब आपको एक पेड़ की संरचना में ग्रिड मिल जाता है, तो आप इसे ओ (लॉगन) में खोज सकते हैं, जो कि बहुत तेज़ हो सकता है, हालांकि ओ (1) नहीं, एक नियमित ग्रिड की खोज के रूप में है।

इसके अलावा, ऐसा लगता है कि जब हर बार कदम पर प्रक्षेप करने की आवश्यकता होती है, अगर ग्रिड को अनुकूल नहीं किया जाता है, तो एक ग्रिड से दूसरे में मैपिंग स्थिर रहती है। तो आप उस मैपिंग की गणना कर सकते हैं (यानी प्रत्येक ग्रिड में जो तत्व दूसरे में किस तत्व से मेल खाता है) जो भी सुविधाजनक है, उसे स्टोर करें, और फिर आपको इसे एगिन (ग्रिड्स बदलने तक) की गणना करने की आवश्यकता नहीं है।

यह आपको प्रक्षेप कोड के साथ छोड़ देता है - जहां आप प्रदर्शन के साथ सटीकता को संतुलित करना चाहते हैं - एक त्रिकोण के पार सरल रैखिक प्रक्षेप तेज है, और काफी अच्छा हो सकता है।

"मैंने किसी दिए गए बिंदु के निकटतम नोड को खोजने के लिए केडी-ट्री का उपयोग करने के बारे में सोचा, फिर मैं उस तत्व के आकार के कार्यों का उपयोग करूंगा"

याद रखें कि निकटतम नोड आपको तत्व नहीं मिलता है - इसलिए आप जिस तत्व को चाहते हैं उसे खोजने के लिए थोड़ा और करना चाहते हैं। एक विकल्प इसके बजाय एक rtree का उपयोग करना होगा, जो बाउंडिंग बॉक्स द्वारा संग्रहीत / खोज करता है - आपको प्रत्येक खोज के साथ एक से अधिक तत्व मिलेंगे, लेकिन आप जांच सकते हैं कि उनमें से कौन सा सीधे सही है।


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

1
मैं अभी भी अपने दृष्टिकोण से खड़ा हूं कि यह कुशलता से नहीं किया जा सकता है :-) वास्तव में दो समस्याएं हैं: (i) आमतौर पर आपके पास अंक हैं, इसलिए प्रत्येक बिंदु के लिए लुकअप अभी भी होता है समग्र व्यवहार। (ii) सबसे महंगा हिस्सा वास्तव में उस सेल पर प्रक्षेप है जो आपने अभी पाया है क्योंकि आपको उस सेल के समन्वय प्रणाली में वापस बदलना होगा, आकृति कार्यों का मूल्यांकन करना होगा, गुणांक के साथ गुणा करना होगा, इत्यादि यदि आपको ज़रूरत है तो बहुत काम है। बड़ी संख्या में प्रक्षेप बिंदुओं के लिए इसे करने के लिए। हे(एन)हे(लॉगएन)
वोल्फगैंग बैंगर्थ

7

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


हाँ। लेकिन मैं ठीक ग्रिड से मानों को मोटे ग्रिड में "इंजेक्ट" करना चाहता हूं, यही कारण है कि मैंने स्थानांतरण कहा।
बर्नार्डो एमआर

3

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

बीAB

  1. BpiA
  2. pi
  3. पी1पी2पी3

एनहे(एन)हे(एक्स(एन,))


2

यह उस तरह का काम है जिसके लिए आप वास्तव में असंरचित जाल से बचना चाहते हैं क्योंकि किसी भी महत्वपूर्ण संख्या के लिए कुशलतापूर्वक ऐसा करने का कोई तरीका नहीं है। आपको उन मेषों का उपयोग करने पर विचार करना चाहिए जो कम से कम किसी न किसी तरह से संबंधित हैं। उदाहरण के लिए, यदि वे दोनों एक मोटे जाल के पदानुक्रमित शोधन से प्राप्त किए जाते हैं, तो आप अपेक्षाकृत आसानी से और कुशलता से यह पता लगा सकते हैं कि एक जाल के प्रक्षेप बिंदु दूसरे जाल पर कहां स्थित हैं।


मुझे लगता है कि यह सबसे अच्छा विकल्प हो सकता है (ग्रिड के पदानुक्रम)। यदि यह मामला है, तो क्या आप किसी अच्छी डेटा संरचना, या विशिष्ट विधि का उपयोग करना जानते हैं?
बर्नार्डो एमआर

हाँ, पदानुक्रमित मेष सभी को क्वाड / ऑक्ट-ट्री (यदि वे एक मोटे सेल पर शुरू होते हैं) या ऐसे पेड़ों (यदि मोटे जाल में एक से अधिक बार सेल हो) के जंगलों के रूप में संग्रहीत किया जाता है।
वुल्फगैंग बंगर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.