最近又对以前写过的柑橘溃疡病检测的代码作了很大的调整。主要集中在三个方面:分解功能模块、统一命名方式与调用方式、循环修改为矩阵运算。
记录一些感受。望自己以后多加注意。
1、不要 在一个函数中集中太多的功能;如果功能模块能分解,那么,就尽最大努力的分解;函数功能愈单一愈好
功能模块分解后能够最大限度的提高代码复用;
调试时也方便许多
2、不要使模块过度灵活或者过度复杂;应该在灵活性与复杂度之间取一个合适的平衡;
与第一个问题似乎差不多
有一个时间段,总喜欢将函数做的非常复杂,希望能够完成好几种类似的功能;每次都采用matlab变参实现,变参多了,使得函数变得非常难以理解。
比如,一个 AdaBoost 函数,它需要完成 AdaBoost 按轮数训练、AdaBoost 按特征数、AdaBoost 测试、同时训练并测试等类似的功能;以前做的就是把所有功能集成在一起;在现在看来,这是一个非常烂的设计。调试困难,调用时无法通过函数名知道其所需要的功能;并且,代码重用非常困难。
在上一次的代码重构中,已经将这些分解了。但分解了仍然不够彻底。现在这个函数已经拆成七八块了。
AdaBoostClassfy AdaBoost 强分类器对一组样本进行分类
AdaBoostWeakLearnerClassfy AdaBoost弱分类器对一组样本进行分类
searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 在训练集上训练 AdaBoost 分类器
testAdaBoostClassifier 在测试集上测试 AdaBoost 分类器
testAdaBoost(训练与测试) 将样本随机划分为训练集与测试集,多次训练测试AdaBoost分类器
AdaBoost(训练与测试) 给定训练集与测试集,训练测试AdaBoost分类器
testAdaBoost 与 AdaBoost 类似,均是先训练分类器,而后测试分类器
testAdaBoost 测试多次,并且将样本集分为训练集与测试集
testAdaBoost 通过调用 AdaBoost 函数实现多次的分类器训练与测试
AdaBoost调用 trainAdaBoostClassifier 训练, 调用 testAdaBoostClassifier 进行测试
目前的设计不仅没有任何的重复代码,并且可扩充性也强许多。目前看来,还算一个不错的设计了。也许几个月后看,还存在许多问题。到时候再来解决吧。
3、形成一个习惯的命名方式,并严格执行
变量命名:尽量采用全名
复杂对象(向量、矩阵、结构体、cell)首字母大写
简单变量(int,double)之类,首字母小写
比如:Samples 待分类的样本, cntSamples x cntFeatures 矩阵
boostthresh AdaBoost强分类器的阈值,默认为0.5
同一类型的变量采用同样的命名,比如数量前加:cnt,比如,
样本数量:cntSamples ;特征数量 cntFeatures
函数命名: 动词+名词 方式,尽量采用全名
比如:searchBestWeakLearner 在特征列上获得最优的阈值分类器
trainAdaBoostClassifier 训练AdaBoost分类器
统一命名方式后,结合注释,代码的可读性会大大提高。
4、循环尽量改为矩阵操作
采用矩阵操作后代码会简洁许多,但会变得很难理解。需要增加注释,方便理解。
5、归结几点:
在完成功能的基础上
可读性第一:就是要有良好的代码风格,比如注释良好而丰富、命名易理解、使用变量替换常数、代码缩进、不要写太长的嵌套调用、相关代码集中,等等等等
可扩展性第二:变参需适量控制;函数功能单一;
性能第三:最后考虑性能,matlab里面尽量采用矩阵替换循环
血的教训!!多加注意!!!!!!!
还约需要2.5周才能完成代码重构,任重而道远!!
分享到:
相关推荐
- 确保MATLAB版本与源码兼容,因为不同版本可能会有语法差异,如果遇到乱码问题,可以用文本编辑器(如记事本)打开代码并复制到对应版本的MATLAB环境中。 - 调整模型超参数以优化性能,例如学习率、膨胀系数、...
代码设计采用了参数化编程方法,这意味着用户可以通过简单的修改参数来调整算法的行为,而无需深入了解程序的内部逻辑。这种设计方式对于新手尤其友好,因为它极大地降低了学习和使用算法的门槛。同时,代码中的注释...
同时,由于代码提供了附赠的案例数据,用户可以直接运行程序来验证代码的正确性和直观感受喇叭天线的辐射特性。 这套Matlab代码对于电子信息技术领域的研究者、工程师以及相关专业的学生来说,是一个实用且有价值的...
通过实际运行MATLAB程序,学生可以获得关于STBC算法性能的直观感受,并通过修改案例数据和参数,进一步探索其性能变化的规律。本套代码的实用性不仅限于教学领域,同样也可供相关领域的工程师和技术人员在研究和开发...
代码的设计特点在于参数化编程,这意味着使用者可以根据自己的需要方便地更改游戏参数,如纸牌数量、玩家分数等,从而使得程序更加灵活和可扩展。此外,代码中还包含了详尽的注释,这不仅有助于理解程序的结构和算法...
在MATLAB这一强大的数值计算和可视化平台上,用户可以编写代码来计算和可视化两个概率分布之间的KL散度。一般而言,这样的任务需要用户定义一个特定的函数,如`KLDiv.m`,它负责执行主要的计算过程。这个函数接受两...
在描述中提到,“SAR各种波形仿真MATLAB源码,而且会自动变化给人以直观感受”,这意味着该压缩包可能包含了多种SAR信号模型的MATLAB代码,这些代码不仅能够模拟不同的SAR波形,还可能具有交互性,用户可以通过调整...
代码的主要特点在于参数化编程,这意味着用户可以方便地通过更改参数来适应不同的计算需求和条件,而不必深入修改代码的主体结构。这样的设计使得代码具有很好的通用性和易用性。 代码中还包含了详细的注释,这对于...
参数化编程允许用户通过简单修改参数来改变程序的行为,这种方式极大地提高了代码的灵活性和可重用性。对于计算机、电子信息工程、数学等相关专业的学生来说,这种编程思路清晰、注释明细的代码可以作为学习和参考的...
这些代码附赠有案例数据,用户可以直接运行Matlab程序进行实践,感受对数和指数变换在图像处理中的实际效果。这样的实践操作对于计算机科学、电子信息工程以及数学等专业的大学生来说,是一个非常好的课程设计、期末...
`license.txt` 文件通常是软件或代码的许可协议,规定了用户可以如何使用、分发和修改代码。在MATLAB开发中,遵循正确的许可协议是非常重要的,因为它确保了知识产权的尊重和合规使用。 在实际应用中,这样的MATLAB...
对于研究者而言,清晰的代码结构和可修改的参数设计提供了便捷的研究起点。研究者可以通过更改参数或编写新的代码段来对现有的GMSK调制和MLSD检测算法进行优化,或是探索新的算法思路,从而推动通信技术的发展。 这...
代码的版本支持包括2014、2019a以及未来的2024a,这意味着用户可以在多个Matlab版本上运行该代码,即使未来Matlab更新了新的版本,用户也可以通过适应性的调整继续使用。 代码的一个重要特点在于其参数化编程方式,...
代码的设计特点在于参数化编程,这意味着用户可以通过方便地更改参数来适应不同情况下的风电功率预测需求,而无需深入修改程序的主体结构。此外,代码编程思路的清晰以及注释的详细,使得整个程序不仅具有实用性,...
使用时,用户还可以通过附赠的案例数据直接运行Matlab程序,验证代码的有效性并获得实际应用的直观感受。 为了更好地利用这一资源,用户应熟悉Matlab编程环境,了解基本的图像处理概念,以及对主动轮廓模型有一定...
`license.txt` 文件是软件许可协议,通常包含关于代码使用、修改和分发的法律条款。在MATLAB项目中,这可能意味着作者对代码的使用权和版权进行了规定,用户在使用代码前需要阅读并遵守这些条款。 在MATLAB中开发...
使用此代码的用户能够通过简单的参数修改,迅速适应不同的优化问题和应用场景。代码的编写遵循参数化编程原则,即使用一系列预定义的参数变量来控制算法的行为,使得即使是对遗传算法不太熟悉的用户,也能通过更改...
其次,代码的参数更改过程非常便捷。这得益于MATLAB开发环境的友好性和MATLAB语言的高度可读性。用户无需深入了解复杂的编程语法,就可以轻松实现参数的修改和调整,从而快速得到想要的实验结果。 另外,代码在编写...
此外,代码具有参数化编程的特点,意味着用户可以方便地修改参数以适应不同的应用场景和需求,代码中的注释详尽,有助于用户理解每一部分代码的功能和实现方式,从而更好地把握整个程序的设计思路。 适用对象主要是...
通过这套Matlab代码的实践,用户可以更加直观地感受到理论知识与实际应用之间的联系,为将来从事通信技术相关工作打下坚实的基础。 本压缩包文件提供的Matlab代码不仅是一套工具,更是一个教育和研究的平台,它有助...