में विशेष इंडेक्स को पूरा करने के लिए bsxfun का विस्तार मुझे कोई समस्या है। मैं कोड के इस छोटे टुकड़े को लागू करने की कोशिश कर रहा हूं। एक मैट्रिक्स
मूलभूत कदम जो मैंने पहले ही कर चुके हैं। नीचे मेरी कोड की जाँच करें:
clc;clear all;close all;
A=round(-3+(6).*rand(5,5));
B=round(-3+(6).*rand(5,5));
%//The check matrix stores the conditions present on the right side of the equation.
check = A.*B
%//upd_max and upd_min are the given as the del_max and del_min in the equation
upd_max = 0.5;
upd_min = 0.1;
%//eta_plus and eta_minus are denoted as nplus and nminus
nplus = 1.2;
nminus = 0.5;
%del_(k-1)_i matrix is given as update_mat
update_mat = (0.1+(0.4).*rand(size(check))).*ones(size(check))
update_new = update_mat.*(check==0) + bsxfun(@min,(nplus.*update_mat.*(check>0)),upd_max)...
+ bsxfun(@max,nminus.*(update_mat.*(check<0)),upd_min)
मैं कोड के अपने टुकड़ा का एक नमूना परिणाम के नीचे दे रहा हूँ:
check =
2 -6 0 -1 2
-3 -4 3 -3 4
0 2 -2 6 0
2 -1 -4 -1 -3
-2 -4 -3 0 6
update_mat =
0.4102 0.4173 0.1126 0.2268 0.4964
0.4622 0.3750 0.4282 0.3422 0.1495
0.4760 0.3820 0.2903 0.3143 0.1473
0.3603 0.2861 0.3122 0.3527 0.2908
0.3602 0.3696 0.3220 0.2046 0.4746
update_new =
0.5922 0.2087 0.2126 0.1134 0.6000
0.2311 0.1875 0.6000 0.1711 0.2794
0.5760 0.5584 0.1452 0.4772 0.2473
0.5324 0.1431 0.1561 0.1763 0.1454
0.1801 0.1848 0.1610 0.3046 0.6000
हालांकि इस जवाब सही नहीं है !!
update_mat.*(check==0)
ans =
0 0 0.1126 0 0
0 0 0 0 0
0.4760 0 0 0 0.1473
0 0 0 0 0
0 0 0 0.2046 0
bsxfun(@min,(nplus.*update_mat.*(check>0)),upd_max)
ans =
0.4922 0 0 0 0.5000
0 0 0.5000 0 0.1794
0 0.4584 0 0.3772 0
0.4324 0 0 0 0
0 0 0 0 0.5000
के रूप में स्पष्ट रूप से देखा जा सकता है first
दो शब्दों सही हैं: मैं तीन भागों में मेरा उत्तर विभाजित कर रहा हूँ की व्याख्या करने के। हालांकि तीसरा शब्द गलत है। तीसरे कार्यकाल इस रूप में आता है:
bsxfun(@max,nminus.*(update_mat.*(check<0)),upd_min)
ans =
0.1000 0.2087 0.1000 0.1134 0.1000
0.2311 0.1875 0.1000 0.1711 0.1000
0.1000 0.1000 0.1452 0.1000 0.1000
0.1000 0.1431 0.1561 0.1763 0.1454
0.1801 0.1848 0.1610 0.1000 0.1000
सही तीसरे कार्यकाल मुझे
0 0.2087 0 0.1134 0
0.2311 0.1875 0 0.1711 0
0 0 0.1452 0 0
0 0.1431 0.1561 0.1763 0
0.1801 0.1848 0.1610 0 0.1000
देना चाहिए मैं तत्व की गणना करने के bsxfun बुद्धिमान चाहते अधिकतम केवल की गैर शून्य तत्वों के लिए मैट्रिक्स nminus.*(update_mat.*(check<0))
और पूरे matrices नहीं। क्या ऐसा करना संभव है?
अग्रिम धन्यवाद! पीएस: कृपया बेहतर अनुकूलित कोड के लिए विचार दें।
मैं आपका विचार समझता हूं और यह भी काम करता है! लेकिन क्या मैं इसे करने के लिए bsxfun का उपयोग नहीं कर सकता? जैसा कि मैं समझता हूं कि यह काफी तेज़ है। – roni
@roni यह नहीं है कि bsxfun क्या करता है। मुझे अत्यधिक संदेह है कि यह तार्किक अनुक्रमण से तेज होगा। यह 'repmat' या loops का उपयोग करने से अक्सर तेज़ होता है लेकिन जब आप स्केलर से निपट रहे होते हैं, तो यह व्यर्थ है। जाने का यह रास्ता है। – Dan
@roni Bsxfun का उपयोग तब किया जाता है जब आपको आयामों से मेल खाने के लिए ** वैक्टर ** का विस्तार करने की आवश्यकता होती है। स्केलर्स व्यर्थ है और ओवरहेड में जोड़ता है। – Oleg