Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以更为惯用和高效的方式重新编写此MATLAB代码?_Matlab_Refactoring - Fatal编程技术网

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

如何以更为惯用和高效的方式重新编写此MATLAB代码?,matlab,refactoring,Matlab,Refactoring,这是一个要求:输入是一个数字,它将图像分成几个相等的部分。例如,如果输入为4,它将返回3部分:值是imgSize/4imgSize/4*2和imgSize/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

这是一个要求:输入是一个数字,它将图像分成几个相等的部分。例如,如果输入为4,它将返回3部分:值是
imgSize/4
imgSize/4*2
imgSize/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\u thres
。如何重新编写此代码以提高效率?

这样就可以了-

divide_thres = [1:colorLevel-1]*round(imgSize/colorLevel)
这应该可以-

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

您的代码有几个问题:

  • 在每种情况下,您都会不必要地将
    imgSize
    除以同一个因子多次(而不是一次性)
  • 您可以执行许多“手动”标量乘法,但只需将标量值乘以范围
    1:colorLevel-1
    生成的向量即可
  • 由于生成的
    divide_thres
    向量的长度可以很容易地从
    colorLevel
    的值计算出来,因此不需要在
    if
    语句中单独处理每种情况

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

如果2您的代码有几个问题:

  • 在每种情况下,您都会不必要地将
    imgSize
    除以同一个因子多次(而不是一次性)
  • 您可以执行许多“手动”标量乘法,但只需将标量值乘以范围
    1:colorLevel-1
    生成的向量即可
  • 由于生成的
    divide_thres
    向量的长度可以很容易地从
    colorLevel
    的值计算出来,因此不需要在
    if
    语句中单独处理每种情况

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

如果您的代码仅适用于
colorLevel=3,4,8
,但您的文本显示“输入一个从2到255的值”
?那么,如果用户输入一个其他值
3,4,8`,该怎么办?是的,我想容纳从2到255的每个数字,我只给出了3,4,8作为三个示例。用户是否也可以输入
n=1
?如果是,输出必须是什么?
n=1
在我的例子中应该只返回一个错误。您的代码只适用于
colorLevel=3,4,8
,但您的文本显示“输入一个从2到255的值”
?那么,如果用户输入其他值
3,4,8`,该怎么办?是的,我想容纳2到255之间的每个数字,我只给出了3,4,8作为三个示例。用户也可以输入
n=1
?如果可以,输出必须是什么?
n=1
应该只是在我的情况下返回一个错误。谢谢您的回答!谢谢你的回答!