2013-12-13 16 views
6

問題があります。私はこの短いコードを実装しようとしています。 enter image description hereマトリックス内の特定のインデックスに対応する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 

この答えが正解ではありませんが! first二つの用語が正しいはっきりと見ることができるように

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 

:私は三つの部分に私の答えを分割しています説明するために。しかし、第3項は間違っています。 第三項は、このよう来る:

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))であり、行列全体ではありません。それは可能ですか?

ありがとうございます! PS:コードを最適化するためのアイデアをお願いします。

答えて

6

あなたはスカラーを扱っているので、あなたがbsxfunを必要としない、あなただけの論理的なインデックス作成を必要とする:

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

(ところでこれはあなたの例のデータのために2つ目の最後の行にミスを犯したことを前提としてい最後の列の0がありますが、私はあなたがほしいと思うと思う0.1454

+0

私はあなたの考えを理解しており、それも機能します!私はそれを行うbsxfunを使用することはできません?私はそれがはるかに高速であることを理解する。 – roni

+2

@roniこれはbsxfunの動作ではありません。私は、それが論理インデックス作成よりも速いことを非常に疑います。 'repmat'やループを使うよりも速いのが普通ですが、スカラーを扱うときは無意味です。これが行く方法です。 – Dan

+3

@roni Bsxfunは、次元を一致させるためにベクトル**を展開する必要がある場合に使用されます。スカラーでは無意味であり、オーバーヘッドに追加されます。 – Oleg

関連する問題