6

我有个问题。我正在尝试实现这段简短的代码。 在此处输入图像描述

我已经完成了基本步骤。请在下面检查我的代码:

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:请提供更好的优化代码的想法。

4

1 回答 1

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

于 2013-12-13T07:48:16.760 回答