vectorization - Generating arrays using bsxfun with anonymous function and for elementwise subtractions - MATLAB -


मेरे पास निम्न कोड है:

  n = 10000; S = 100; Z = रैंड (एन, 2); एक्स = रैंड (एस, 1); Y = रैंड (एस, 1); मज़े = @ (ए) एप (ए);  

सिद्धांत रूप में, अनाम फ़ंक्शन f का एक अलग रूप हो सकता है मुझे दो सरणियों को बनाने की आवश्यकता है।

सबसे पहले, मुझे जेनेरिक तत्वों

  मज़ेदार (जेड (i , 1) - एक्स (जे)) * मज़े (जेड (आई, 2) - वाई (के))  

जहां i = 1, ... n जबकि j, k = 1, ..., s । मैं आसानी से क्या कर सकता हूं, bsxfun का उपयोग करके मैट्रिक्स का निर्माण करना है, उदा।

  bsxfun (@ (x, y) मज़ेदार (x - y), Z (:, 1), एक्स '); बीएसएक्सफ़न (@ (एक्स, वाई) मज़े (एक्स - वाई), जेड (:, 2), वाई ');  

लेकिन फिर मुझे उन दो मैट्रिक्स के तत्व-वार कॉलम को गुणा करके उन्हें 3D सरणी में संयोजित करने की आवश्यकता होगी।


दूसरे चरण में, मुझे आकार की एक सरणी बनाने की आवश्यकता है nx 3 xsxs , जो निम्नलिखित मैट्रिक्स के रूप में एक तरफ से दिखेंगे

  [ones (n, 1), जेड (:, 1) - एक्स (आई), जेड (:, 2) - वाई (जे);]  

जहां i = 1, ... S , j = 1, ... s । मैं

  A = [ones (n, 1), z (:, 1) - x (1), z (:, 2) जैसे कुछ अतिरिक्त आयामों पर पाश कर सकता हूं - y (1)]; के लिए मैं = 1: s जम्मू = 1: s ए (:,,,, i, j) = [हैं (n, 1), z (:, 1) - x (i), z (:, 2) - y (जे);]; अंत की समाप्ति  

क्या लूप से बचने का एक तरीका है?


तीसरे चरण में, मान लें कि सरणी out1 प्राप्त करने के बाद ( पहले चरण से आउटपुट), मैं एक नया सरणी out3 आयाम का nxnxsxs बनाना चाहते हैं, जिसमें मुख्य विकर्ण पर मूल सरणी out1 होता है, यानी out3 (i, i, s, s) = out1 (i, s, s) और out3 (i, j, s, s) = 0 सभी के लिए < कोड> मैं ~ = j । क्या "विकर्ण एरेज़" बनाने के लिए diag का कोई वैकल्पिक विकल्प है? वैकल्पिक रूप से, अगर मैं nxnxsxs सरियों के सरणी बना देता हूं, तो क्या मुख्य विकर्ण पर out1 डाल दिया जा सकता है?

कोड

  exp_Z_x = exp (bsxfun (@ शून्य, जेड (:, 1), x । ')); % // 'exp_Z_y = exp (बीएसएक्सफ़न (@ शून्य, जेड (:, 2), y' ')); % // 'out1 = bsxfun (@ समय, exp_Z_x, परिमित (exp_Z_y, [1 3 2])); Z1 = [लोग (एन, 1) जेड (:, 1) जेड (:, 2)]; एक्स 1 = अनुक्रमित करें ([शून्य (एस, 1) x शून्य (एस, 1)], [3 2 1]); Y1 = अनुक्रम ([शून्य, 1) शून्य (एस, 1) y], [4 2 3 1]); Out2 = bsxfun (@ शून्य, बीएसएक्सफ़न (@ शून्य, जेड 1, एक्स 1), वाई 1); आउट 3 = शून्य (एन, एन, एस, एस); % // out3 (n, n, s, s) = 0; प्रदर्शन के लिए इस्तेमाल किया जा सकता है 3 (बीएसएक्सफ़न (@ प्लस, [1: n + 1: n * n] ', [0: s * s-1] * n * n)) = आउट 1; % // '% // out1, out2 और out3 वांछित आउटपुट हैं  

Comments