首先,我对于这个问题的观点是:可以,但没必要。
要说MATLAB比C++强在哪里,首先我们先来探讨一下MATLAB和C++谁更强这个问题——实际上此处我可能是在抖机灵,因为这是完全没有可比性的,C++虽然在整个编程世界里有着惊人的应用广度,但是针对数学建模竞赛中几个主要的需要用到编程的环节来说,并不会帮助参赛者节省任何力气,相反,会浪费参赛者大量的时间。
关于时间的节约,这里我可以举一个很小的例子,就比如求解一个简单的一元二次方程,如果用C++的话,代码量上相对就是比较大的,这里我搜索了一个网络上的例子[1]:
#include <iostream> #include <cmath> using namespace std; int main() { float a, b, c, x1, x2, discriminant, realPart, imaginaryPart; cout << "输入 a, b 和 c: "; cin >> a >> b >> c; discriminant = b*b - 4*a*c; if (discriminant > 0) { x1 = (-b + sqrt(discriminant)) / (2*a); x2 = (-b - sqrt(discriminant)) / (2*a); cout << "Roots are real and different." << endl; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; } else if (discriminant == 0) { cout << "实根相同:" << endl; x1 = (-b + sqrt(discriminant)) / (2*a); cout << "x1 = x2 =" << x1 << endl; } else { realPart = -b/(2*a); imaginaryPart =sqrt(-discriminant)/(2*a); cout << "无实根:" << endl; cout << "x1 = " << realPart << "+" << imaginaryPart << "i" << endl; cout << "x2 = " << realPart << "-" << imaginaryPart << "i" << endl; } return 0; }
但是在MATLAB当中,如果要实现完全相同的功能的话则相对要简单也更符合数学运算本身的表达方式:
function solution = solveFunction(a,b,c) discriminant = b^2 - 4*a*c; if discriminant > 0 solution(1,1) = (-b + sqrt(discriminant)) / (2*a); solution(1,2) = (-b - sqrt(discriminant)) / (2*a); elseif discriminant == 0 solution = (-b + sqrt(discriminant)) / (2*a); disp('实根相同'); else solution(1,1) = (-b/(2*a)) + 1i*(sqrt(discriminant)/(2*a)); solution(1,2) = (-b/(2*a)) - 1i*(sqrt(discriminant)/(2*a)); disp('无实根'); end end
实际上使用MATLAB本身自带的符号工具箱来求解甚至可以在四行代码内完美搞定这个求解问题(可以简单理解为“输入方程->得到结果”的一步到位过程),但C++下的话即使有这样方便的求解库(笔者用C++较少,还望技术大牛赐教),也在使用上必然更加繁琐,
与此同时,如果要查看调用函数之后求解的结果的话,在C++里要么需要打印在控制台上(数据较少时),数据量大时要么就需要输出为相应的数据文件(txt,csv等),但是MATLAB的工作区绝大多数时候都可以直接保存所有输出的结果(内存支持范围内),如果只是需要简单检查的话可以直接点击查看,在检查程序中可能出现的计算问题时也更容易找到问题所在的地方。
除去在编程上更加省力,在处理多维数据上,MATLAB本身所基于的矩阵运算在运算效率上也有更好的表现。比如说在C++下不依赖opencv等工具包求解图像的频谱图的话,就必须使用多层for loop进行嵌套,运算效率非常有限,但在MATLAB利用矩阵运算的公式的话速度则会大幅提高。或许一些读者会表示可以调包使用,但问题是数学建模竞赛中无论美赛还是国赛,大多数问题并没有非常成熟的数学模型,如果遇到类似的情况,巧用矩阵运算是可以节省很多等待计算机输出结果的时间的。
说完MATLAB在编程中相对于C++在数学建模竞赛这种并不复杂的应用场景的优越性,我们有必要讨论数学建模竞赛中究竟需要用编程来解决哪些问题,按照数学建模的基本过程范式(假设、建模、求解、分析、检验)和笔者的个人经验,编程主要的运用在于求解、统计学分析和模型检验。求解上的方便性在前文已经有所涉及,实际上对于包含多个数学公式、复杂参数的模型的求解来说,MATLAB的优越性将会更加明显(比如2016年国赛A题)。而在偏向统计学分析的题目上,不依赖专用的统计学软件(如SPSS),MATLAB可以直接对建模获得的各种数据直接进行分析、作图(MATLAB的作图相比于C++可谓是简单至极且调整各种参数也更简单快捷——你甚至可以直接用鼠标点击生成的元素来调整它们的大小、线型、字体等等)。模型检验涉及的编程需求和前两点大同小异,在此也就不赘述了。
那么最后,笔者想说,对于MATLAB大可不必头疼,相比于C++和JAVA这两门初学者常学的面向对象语言,MATLAB作为一个支持面向过程(甚至可以说其使用者大多数都使用其面向过程的风格为主)的程序语言,其入门和上手的难度对于有一定编程基础的用户来说是远低于C++的,基本上去图书馆找一本题如“MATLAB从入门到精通”的厚薄适中的书籍,照着上面的代码敲几个小时完全绰绰有余了。在针对数学建模竞赛的准备中,参考本问题下@失序的机器 推荐的几本书就可以掌握针对数学建模竞赛的常用MATLAB技巧了。