matlab - Multiplication of corresponding 2d slices of two arrays and inversion of array slices -
मेरे पास दो आयाम हैं a
और b
उसी आयाम का < कोड> 1000 x 3 x 20 x 20 । मैं एक तीसरे सरणी C
आयाम का 3 x 3 x 20 x 20
उत्पन्न करना चाहता हूं जो कि A और
बी
, यानी सी (:,:, i, j) = ए (:,:, i, j) '* बी (:,:, i, j) । फिर मुझे एआरए
C
को संगत 3 x 3
मैट्रिक्स, यानी डी (:, inverting द्वारा नए सरणी
। फिर, यह स्पष्ट है कि यह लूप के साथ कैसे करें। डी
में बदलने की जरूरत है I :, I, j) = inv (सी (:,:, i, j)) 400
वस्तुओं पर लूपिंग करने का एक तरीका है?
संपादित करें: विभिन्न समाधानों के प्रदर्शन की तुलना करने के लिए बेंचमार्किंग कोड होगा -
% // इनपुट N1 = 50; एन 2 = 200; ए = रैंड (एन 1, 3, एन 2, एन 2); बी = रैंड (एन 1, 3, एन 2, एन 2); % // ए। सीपीयू लोकी कोड टिक सी = शून्य (3,3, एन 2, एन 2); आईआई = 1: एन 2 के लिए जे जे = 1: एन 2 सी (:,:, आईआई, जे जे) = ए (:,:, आईआई, जे जे) 'बी (:,:, आईआई, जे जे); % // 'एंड एंड टूक% // बी। वेक्साइज्ड कोड (स्क्वीज़ का प्रयोग करें) टिक सी 1 = निचोड़ (राशि (बीएसएक्सफ़न (@ बार, पर्म्यूट (ए, [2 1 5 3 4]), परमिट (बी, [5 1] 2 3 4])), 2)); Toc% // सी। वर्गीकृत कोड (निचोड़ से बचने) टिक सी 2 = योग (बीएसएक्सफ़न (@ टाइम्स, पर्म्यूट (ए, [2 5 3 4 1]), परमिट (बी, [5 2 3 4 1]), 5 ); Toc% // डी। GPU vectorized कोड टिक A = gpuArray (ए); बी = जीपीयूआरआरए (बी); सी 3 = योग (बीएसएक्सफ़न (@ बार, पर्म्यूट (ए, [2 5 3 4 1]), परमिट (बी, [5 2 3 4 1])), 5); सी 3 = इकट्ठा (सी 3); Toc
रनटाइम परिणाम -
बीत गया समय 0.287511 सेकंड है। बीत हुआ समय 0.250663 सेकंड है। बीत हुआ समय 0.337628 सेकंड है बीत गया समय 1.25 9, 207 सेकेंड है।
कोड
% // भाग - 1 सी = योग (बीएसएक्सफ़न (@ बार, पर्म्यूट (ए, [2 5 3 4 1]), परम्यूट (बी, [5 2 3 4 1])), 5); % // भाग -2: MATLAB फ़ाइल-विनिमय उपकरण का उपयोग multinv डी = multinv (सी); multinv
के लिए फ़ंक्शन कोड उपलब्ध है और यह काफी कुशल होने का दावा करता है।
पहले भाग के लिए, आप भी कोशिश कर सकते हैं यह -
सी = निचोड़ (राशि (बीएसएक्सफ़न (@ बार, पर्म्यूट (ए, [2 1 5 3 4]), परमिट (बी, [5 1 2 3 4])), 2));
ऐसा लगता है कि ये तत्व ऊपर दिए गए कोड में वर्णित तत्वों के रूप में "विघटनकारी" नहीं हैं, लेकिन नकारात्मकता निचोड़
की आवश्यकता है यह थोड़ी धीमा हो सकता है मैं इसे आपको छोड़ दूँगा और बेंचमार्क के लिए भी प्रोत्साहित करूंगा और बेहतर एक का चयन करूंगा।
क्यों bsxfun
+ GPU
?
मैंने लूप की सीमाएं बढ़ाईं हैं, क्योंकि यह एक लोपी कोड और वैक्टरित कोड के बीच एक वास्तविक परीक्षण हो सकता है। इसलिए, यहां भाग 1 के लिए संशोधित कोड है -
% // input n1 = 50; एन 2 = 200; ए = रैंड (एन 1, 3, एन 2, एन 2); बी = रैंड (एन 1, 3, एन 2, एन 2); % // ए। सीपीयू लोकी कोड टिक सी = शून्य (3,3, एन 2, एन 2); आईआई = 1: एन 2 के लिए जे जे = 1: एन 2 सी (:,:, आईआई, जे जे) = ए (:,:, आईआई, जे जे) 'बी (:,:, आईआई, जे जे); % // 'एंड एंड टूक% // बी। GPU vectorized code टिक A = gpuArray (A); बी = जीपीयूआरआरए (बी); सी 1 = योग (बीएसएक्सफ़न (@ बार, पर्म्यूट (ए, [2 5 3 4 1]), परम्यूट (बी, [5 2 3 4 1])), 5); सी 1 = इकट्ठा (सी 1); Toc
मेरे सिस्टम में रनटाइम परिणाम थे -
विलंबित समय 0.310056 सेकंड है बीत हुआ समय 0.172499 सेकंड है।
तो, आप देख रहे हैं!
Comments
Post a Comment