【问题标题】:extension of bsxfun to cater to particular indices in a matrixbsxfun 的扩展以满足矩阵中的特定索引
【发布时间】:2013-12-31 21:59:00
【问题描述】:

我有问题。我正在尝试实现这段简短的代码。

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

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&lt;0)) 的非零元素而不是整个矩阵的元素最大值。有可能吗?

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

【问题讨论】:

    标签: matlab image-processing max min bsxfun


    【解决方案1】:

    你不需要 bsxfun 因为你正在处理一个标量,你只需要逻辑索引:

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

    (顺便说一句,这假设对于您的示例数据,您在拥有0 的最后一列的倒数第二行中犯了一个错误,但我认为您想要0.1454

    【讨论】:

    • 我理解你的想法,它也有效!但我不能用 bsxfun 来做吗?据我了解,它明显更快。
    • @roni 这不是 bsxfun 所做的。我高度怀疑它会比逻辑索引更快。它通常比使用 repmat 或循环更快,但是当您处理标量时,它是没有意义的。这是要走的路。
    • @roni Bsxfun 在您需要扩展 vectors 以匹配尺寸时使用。使用标量是没有意义的,并且会增加开销。
    • @Dan 谢谢我明白了
    • 只是为了补充@OlegKomarov 所说的内容,Matlab 自动为您扩展标量。
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多