我有问题。我正在尝试实现这段短代码。
我已经完成的基本步骤。请检查下面的代码:
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))
的非零元素而不是整个矩阵计算元素明智的最大值。是否可以这样做?
提前致谢! PS:请提供更好的优化代码的想法。
答案 0 :(得分:6)
你不需要bsxfun,因为你正在处理一个标量,你只需要逻辑索引:
M=nminus.*(update_mat.*(check<0))
M((~~M) & (M < upd_min)) = upd_min %// ~~M is the same as M~=0
(顺便说一下,假设对于您的示例数据,您在最后一列的第二行中出现了错误0
,但我认为您需要0.1454
)