我怎样才能以更惯用和更有效的方式重写这个 MATLAB 代码?

How can I re-write this MATLAB code in a more idiomatic and efficient way?

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

如果输入是n,那么就会returnn - 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。我怎样才能重写这段代码以提高效率?

应该这样做 -

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

您的代码有几个问题:

  • 在每种情况下,您都不必要地将 imgSize 除以同一因数多次(而不是一劳永逸)。
  • 您执行了许多 "manual" 标量乘法,但您可以简单地将标量值乘以范围 1 : colorLevel - 1.
  • 生成的向量
  • 因为生成的divide_thres向量的长度可以很容易地从colorLevel的值中计算出来,所以没有必要在[=15]中分别处理每个案例=]声明。

    此外,即使您必须以不同的方式计算 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