2013-12-13 11 views
6

में विशेष इंडेक्स को पूरा करने के लिए bsxfun का विस्तार मुझे कोई समस्या है। मैं कोड के इस छोटे टुकड़े को लागू करने की कोशिश कर रहा हूं। enter image description hereएक मैट्रिक्स

मूलभूत कदम जो मैंने पहले ही कर चुके हैं। नीचे मेरी कोड की जाँच करें:

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 नहीं। क्या ऐसा करना संभव है?

अग्रिम धन्यवाद! पीएस: कृपया बेहतर अनुकूलित कोड के लिए विचार दें।

उत्तर

6

आप bsxfun की जरूरत नहीं है, क्योंकि आप एक अदिश साथ काम कर रहे, तो आप सिर्फ तार्किक अनुक्रमण की जरूरत है:

M=nminus.*(update_mat.*(check<0)) 
M((~~M) & (M < upd_min)) = upd_min %// ~~M is the same as M~=0 

(btw इस मानता है कि अपने उदाहरण डेटा के लिए आप दूसरे अंतिम पंक्ति में एक गलती की है अंतिम कॉलम में जहां आपके पास 0 है लेकिन मुझे लगता है कि आप 0.1454 चाहते हैं)

+0

मैं आपका विचार समझता हूं और यह भी काम करता है! लेकिन क्या मैं इसे करने के लिए bsxfun का उपयोग नहीं कर सकता? जैसा कि मैं समझता हूं कि यह काफी तेज़ है। – roni

+2

@roni यह नहीं है कि bsxfun क्या करता है। मुझे अत्यधिक संदेह है कि यह तार्किक अनुक्रमण से तेज होगा। यह 'repmat' या loops का उपयोग करने से अक्सर तेज़ होता है लेकिन जब आप स्केलर से निपट रहे होते हैं, तो यह व्यर्थ है। जाने का यह रास्ता है। – Dan

+3

@roni Bsxfun का उपयोग तब किया जाता है जब आपको आयामों से मेल खाने के लिए ** वैक्टर ** का विस्तार करने की आवश्यकता होती है। स्केलर्स व्यर्थ है और ओवरहेड में जोड़ता है। – Oleg

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