MATLAB मैट्रिक्स गुणन (सबसे अच्छा कम्प्यूटेशनल दृष्टिकोण)


10

मुझे दो संदर्भ प्रणालियों (कुल्हाड़ियों) के बीच एक निर्देशांक परिवर्तन करना है। उसके लिए, तीन मैट्रिसेस ( ) को कुछ मध्यवर्ती कुल्हाड़ियों के उपयोग के कारण गुणा करना पड़ता है। मैंने इसे हल करने के लिए दो तरीकों के बारे में सोचा है:3×3

विधि # 1 : गुणन को सीधे बनाना, ,

vf=R1 R2 R3 vi

विधि # 2 : चरणों में विभाजित करें:

  1. v3i=R3 vi
  2. v23=R2 v3i
  3. vf=R1 v23

कहाँ पे:

आर 2 आर 3 3 × 3R1 , और हैं मैट्रिक्सR2R33×3

v i v 3 i v 23 3 × 1vf , , , हैं वैक्टरviv3iv233×1

मैं यह जानना चाहूंगा कि परिवर्तन करने के लिए कौन सी विधि अधिक कुशल कम्प्यूटेशनल (कम समय) है (इसे बहुत बार बनाया जाएगा)।


4
बटेरों का प्रयोग करें ।
क्रिस टेलर

@ क्रिसट्रेलर: आपके सुझाव के लिए बहुत बहुत धन्यवाद।
जूलियनफेरेस

2
कृपया क्रॉसपोस्ट न करें।
बंद

2
ध्यान दें, यहाँ और StackOverflow में दो प्रश्न क्रॉस-पोस्ट किए गए थे। प्रश्नों और उनकी टिप्पणियों और उत्तरों को इस एक में मिला दिया गया है।
एरन अहमदिया

@Will और AronAhmadia: मुझे क्षमा करें। मुझे नहीं पता था कि क्रॉसपोस्ट करना मना है। मैंने हमेशा स्टैकऑवरफ्लो पर अपने प्रश्न पोस्ट किए हैं लेकिन आज मुझे यह नई साइट मिली और मुझे लगा कि शायद मुझे भी यहाँ मदद मिल सकती है।
जूलियनफेरेस

जवाबों:


17

मतलाब बाएं से दाएं गुणा और / या विभाजनों के अनुक्रमों की व्याख्या करता है। इसलिए तुलना में बहुत अधिक महंगा है , क्योंकि आपके पास तीन मैट्रिक्स-वेक्टर उत्पादों के स्थान पर दो मैट्रिक्स उत्पाद और एक मैट्रिक्स-शाकाहारी उत्पाद है।* ( बी * ( सी * v ) )ABCvA(B(Cv))

दूसरी ओर, तुलना में थोड़ा तेज होना चाहिए यदि आप अलग-अलग वैक्टर में मध्यवर्ती को बचाते हैं, जैसा कि आपकी दूसरी विधि बताती है।A(B(Cv))

सामान्य तौर पर यह पता लगाने के लिए कि बड़े पैमाने पर कम्प्यूटेशंस पर छोटे प्रोग्रामिंग अंतरों के प्रभाव को कैसे मापें, मतलब प्रॉम्प्ट '' हेल्प प्रोफाइल '' पर लिखें।


आपके उत्तर में दी गई रोचक जानकारी के लिए धन्यवाद।
जूलियनफेरेस

यदि आप मध्यवर्ती को बचाते हैं तो यह तेज क्यों है?
फेडरिको पोलोनी

@FedericoPoloni: मैं लिखा था कि यह थोड़ा तेज है नहीं मध्यवर्ती को बचाने के लिए।
अर्नोल्ड न्यूमैयर

@ArnoldNeumaier ऊह माफ करना मैंने गलत समझा। :)
फेडेरिको पोलोनी

14

शुरुआत के लिए, मैं मध्यवर्ती चर का उपयोग नहीं करेगा, लेकिन कोष्ठक। जब तक, बेशक, आप मध्यवर्ती परिणामों में रुचि रखते हैं, लेकिन मैं अनुमान लगा रहा हूं।

मैंने मतलाब में निम्नलिखित कोशिश की:

>> N = 500;                                             
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);

>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.

>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.

मुझे हालांकि कहना है कि यह काफी भयावह है। मैंने हमेशा यह माना है कि मैटलब मैट्रिक्स गुणन क्रम के बारे में स्मार्ट होगा, क्योंकि यह एक सरल और कुशल समाधान के साथ एक ज्ञात समस्या है


क्या आप उस हिस्से को याद करते हैं जहां मैट्रिस 3x3 हैं? :)
एरन अहमदिया

2
@AronAhmadia: उफ़ ... याद किया कि, धन्यवाद। मैं उन मैट्रिक्स आकारों के लिए अनुमान लगाता हूं, पूरी समस्या मूट है, लेकिन मैं अभी भी बड़े एन के परिणामों पर हैरान हूं।
पेड्रो

7
मुझे लगता है कि MATLAB अभिव्यक्ति के मूल्यांकन के लिए C पूर्ववर्ती नियमों का पालन कर रहा है क्योंकि फ्लोटिंग पॉइंट गणित साहचर्य नहीं है और उन्हें यह मान लेना है कि आप जानते हैं कि आप क्या कर रहे हैं :)
एरन अहमदिया

2
@ पेड्रो: आपके उत्तर के लिए धन्यवाद। मैट्रिक्स आयाम 3x3 के लिए मैंने जाँच की है कि आपका समाधान सामान्य (कोष्ठक के बिना) मैट्रिक्स गुणन से भी बेहतर है।
जूलियनफेरेस

+1 रन समय को मापने के लिए एक सरल और आसान तरीका दिखाने के लिए धन्यवाद
स्टीवन मैगाना-ज़ूक

14

चूंकि मैट्रिसेस इतने छोटे होते हैं, इसलिए कॉस्ट ओवरहेड में सभी खर्च होने वाले हैं। यदि आप कई बार परिवर्तन करेंगे, D=A*B*Cतो प्रत्येक वेक्टर के लिए एक बार और फिर एक बार पूर्वसंचालन करना तेज़ होगा v_f=D*v_i। आप इसे एक मेक्सिको फ़ाइल में लाने पर भी विचार कर सकते हैं।


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