問題があります。私はこの短いコードを実装しようとしています。 マトリックス内の特定のインデックスに対応する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:コードを最適化するためのアイデアをお願いします。
私はあなたの考えを理解しており、それも機能します!私はそれを行うbsxfunを使用することはできません?私はそれがはるかに高速であることを理解する。 – roni
@roniこれはbsxfunの動作ではありません。私は、それが論理インデックス作成よりも速いことを非常に疑います。 'repmat'やループを使うよりも速いのが普通ですが、スカラーを扱うときは無意味です。これが行く方法です。 – Dan
@roni Bsxfunは、次元を一致させるためにベクトル**を展開する必要がある場合に使用されます。スカラーでは無意味であり、オーバーヘッドに追加されます。 – Oleg