扩展bsxfun以满足矩阵中的特定索引

时间:2013-12-13 07:33:26

标签: matlab image-processing max min 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))的非零元素而不是整个矩阵计算元素明智的最大值。是否可以这样做?

提前致谢! PS:请提供更好的优化代码的想法。

1 个答案:

答案 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