5

मुझे गणित से ऑक्टेव तक कई फाइलों को पोर्ट करना होगा। मुझे Lisp Mathematica parser from ~1991 मिला लेकिन मैं वास्तव में लिस्प के साथ परिचित नहीं हूं, इसलिए मैं सोच रहा था कि अगर किसी को इस दिशा में पोर्टिंग के साथ कोई अनुभव है। WolframAlpha को ईमेल भेजने और भेजने के बाद और कोई वास्तविक परिणाम नहीं है, मुझे एक क्रॉस कंपाइलर बनाने के लिए लेक्स और वाईएसी का उपयोग करना होगा। यह मेरे लिए थोड़ा अधिक लगता है।पोर्टिंग मैथमैटिका टू ऑक्टेव

किसी भी संकेत या पॉइंटर्स की बहुत सराहना की जाएगी।

स्पष्टीकरण:

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

जैसा कि लियोनिद के पद में उल्लेख किया गया है, यह कार्य अत्यधिक लगता है लेकिन मैं एक छात्र शोध सहायक हूं और यह वास्तव में मुझे अपने विभाग में पूरा करना है।

+1

गणित और ऑक्टैव काफी अलग हैं जो मुझे यकीन है कि स्वचालित रूपांतरण असंभव है। क्या आप अधिक विस्तार से वर्णन कर सकते हैं कि आपको क्या चाहिए? सी में एक गणित पार्सर? [फुलफॉर्म] के लिए एक पार्सर (http://reference.wolfram.com/mathematica/ref/FullForm.html) अभिव्यक्ति लिखने के लिए अपेक्षाकृत आसान है, और आप सब कुछ को पूर्णफॉर्म में बदलने के लिए गणित का उपयोग कर सकते हैं। लेकिन मुझे लगता है कि आपको अपना प्रश्न पहले स्पष्ट करना चाहिए। – Szabolcs

+1

यह अत्यधिक क्यों लगता है? यदि फ़ाइलों में केवल साधारण अभिव्यक्तियां होती हैं तो यह सरल होना चाहिए, अन्यथा यह ऑक्टेट में गणित को प्रभावी ढंग से पुन: कार्यान्वित करने के लिए हो सकता है। – acl

उत्तर

11

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

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

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

+1

@ श्री विज़ार्ड धन्यवाद, सही किया गया। एक अपवित्र के लिए भी धन्यवाद। –

18

मैं MATLAB (ऑक्टेव का $$$$ संस्करण) और मैथमैटिका दोनों नियमित रूप से काम करता हूं, और मुझे बहुत भरोसा है कि एक पार्सर/पोर्टर को लागू करना असंभव है जो स्वचालित रूप से गणित से दूसरे में परिवर्तित हो जाता है। स्टार्टर्स के लिए, MATLAB/Octave पैटर्न मिलान या टर्म री-लेखन या कार्यात्मक प्रोग्रामिंग का समर्थन नहीं करता है, जिनमें से सभी गणित में सबसे आम और इष्टतम कोडिंग शैलियों हैं।

उदाहरण के लिए, वास्तव में वहाँ शुद्ध समारोह (Mathematica)

f = #^2&; 

पर विचार MATLAB/सप्टक में इस बात का एक बराबर नहीं है। बेनामी कार्यों पास पर्याप्त आते हैं और आप के रूप में (MATLAB/सप्टक) यह लिख सकता है

[email protected](x)x.^2; 

हालांकि, मेथेमेटिका होगा प्रतीकात्मक वर्ग कुछ भी आप कार्य करने के लिए पारित, जबकि MATLAB केवल पर scalars/वैक्टर/मैट्रिक्स काम करेंगे। तो यदि आप एक शुद्ध कार्य में आते हैं, तो आप शुद्ध कार्य को पारित होने के बारे में समझने के बिना इसे स्वचालित रूप से अज्ञात फ़ंक्शन में फिर से लिख नहीं सकते हैं।

MATLAB/Octave में अनुपलब्ध एक अन्य अवधारणा गणित में आलसी मूल्यांकन/SetDelayed या := है। इसलिए यदि आपके शुद्ध समारोह

f := a #^2 &; 

तो, f समय में a के मान का उपयोग करता है जब f कहा जाता है था। हालांकि, एक गुमनाम समारोह के रूप में यह लिख:

g = @(x)a*x.^2; 

परिभाषा के समय a का मूल्य पर कब्जा, एक बंद के गठन। मैं this answer of mine

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


अंत में, यदि आप सिर्फ MATLAB/सप्टक करने के लिए मेथेमेटिका से भाव कन्वर्ट करने के लिए कोशिश कर रहे हैं, तो आप एक लेने के लिए चाहते हो सकता है ToMatlab पैकेज पर देखें। मैं MATLAB में एक अलग कोड बेस में उपयोग के लिए गणित में गणना से अभिव्यक्तियों को परिवर्तित करने के लिए अक्सर इसका उपयोग करता हूं। एक साधारण उदाहरण होगा:

expr = Sin[x + x^3] + ArcSin[y]; 
ToMatlab[expr] 
Out[1]= sin(x + x.^3) + asin(y) 
2

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

इस प्रकार के कुछ कोड जनरेटर पहले से ही बॉक्स (सी और फोरट्रान के लिए) से बाहर उपलब्ध हैं, इस पर एक नज़र डालें कि उन्हें कैसे कार्यान्वित किया गया है और फिर उन्हें ऑक्टेव/मैटलैब के लिए पुनः लक्षित करें।

+0

मैं सिद्धांत रूप से सहमत हूं, लेकिन किसी ऐसे व्यक्ति के लिए जो पहले से ही एमएमए को नहीं जानता है और छुट्टियों पर ऐसा करना है, यह महत्वाकांक्षी लगता है, और कुछ चीजें आसानी से अनुवाद योग्य नहीं हो सकती हैं (एनडीएसओल्व पर विचार करें)। लेकिन मैं गलत हो सकता था, मैंने कभी कोशिश नहीं की है। – acl

+0

मैं एक विकल्प चुनूंगा और कुछ कोड कन्वर्ट करने का प्रयास करूंगा ताकि यह देखने के लिए कि सबकुछ बदलने के लिए कितना काम होगा। फिर मैं देख सकता हूं कि यह भी संभव है और मेरे मालिक को प्रतिक्रिया प्रदान कर सकता है। – wikke

+0

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

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