如何以更惯用和有效的方式重新编写此MATLAB代码?

1 matlab refactoring

这是要求:输入是一个数字,它将图像分成几个相等的部分.例如,如果输入为4,则返回3个部分:值为imgSize/4 imgSize/4 * 2imgSize/4 * 3.

如果输入是n,则它将返回n - 1元素,如以下实现中所示:

if (colorLevel == 8)
    divide_thres = [ round(imgSize/8) round(imgSize/8)*2 round(imgSize/8)*3 round(imgSize/8)*4 
        round(imgSize/8)*5 round(imgSize/8)*6 round(imgSize/8)*7 ];
elseif (colorLevel == 4)
    divide_thres = [ round(imgSize/4) round(imgSize/4)*2 round(imgSize/4)*3 ];
elseif (colorLevel == 3)
    divide_thres = [ round(imgSize/3) round(imgSize/3)*2 ];
end
Run Code Online (Sandbox Code Playgroud)

我想允许用户输入介于2和255之间的值,然后自动生成divide_thres与该输入相对应的值.如何重新编写此代码以提高效率?

jub*_*0bs 7

您的代码有几个问题:

  • 在每种情况下,您不必要地imgSize多次除以相同的因子(而不是仅仅一次).
  • 您可以执行许多"手动"标量乘法,但您可以简单地将标量值乘以范围生成的向量1 : colorLevel - 1.
  • 因为divide_thres可以从值中容易地计算得到的向量的长度colorLevel,所以不需要在if语句中单独处理每个案例.

    而且,即使你必须以不同的方式计算case imgSize= 3,4和的长度8,你最好还是使用switch语句而不是if语句,因为前者会省去你imgSize == ...每次写的麻烦,这是容易出错和一种代码重复的形式.

这是一个非常简化的方法:

if 2 <= colorLevel && colorLevel <= 255
    divide_thres = round(imgSize / colorLevel) * (1 : colorLevel - 1);
else
    error('invalid colorLevel value') % (or some other informative message)
end
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释! (3认同)