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

时间:2015-04-15 13:06:51

标签: 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

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

2 个答案:

答案 0 :(得分:7)

您的代码存在一些问题:

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

    此外,即使您必须以不同的方式为imgSize = 348计算长度,您也会感觉更好使用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

答案 1 :(得分:1)

这应该这样做 -

divide_thres = [1:colorLevel-1]*round(imgSize/colorLevel)