我怎样才能以更惯用和更有效的方式重写这个 MATLAB 代码?
How can I re-write this MATLAB code in a more idiomatic and efficient way?
这里是要求:输入是一个数字,它将图像分成几个相等的部分。例如,如果输入为 4,它将 return 3 个部分:值分别是 imgSize/4
imgSize/4 * 2
和 imgSize/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
= 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
这里是要求:输入是一个数字,它将图像分成几个相等的部分。例如,如果输入为 4,它将 return 3 个部分:值分别是 imgSize/4
imgSize/4 * 2
和 imgSize/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
=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