MATLAB适合做什么?为什么大学如此使用?它何时优于Python?

53 投票
21 回答
210071 浏览
提问于 2025-04-11 09:29

最近我被要求学习一些MATLAB的基础知识,为了上课。

那它为什么对研究人员和大学工作的人来说这么酷呢?我看到它在处理矩阵和绘图方面很不错……(这些在Python里用一些库也能轻松做到)。

不过,写个函数或者解析文件真是让人头疼。我现在才刚开始,我是不是漏掉了什么?

在“真实”的世界里,我应该考虑用它做什么?什么时候它能比Python做得更好?我说的更好是指:写东西的方式更简单,效果更好。


更新 1:我最想知道的事情之一就是“我是不是漏掉了什么?” :D

更新 2:谢谢大家的回答。我的问题不是关于是否要购买MATLAB。学校可以免费给我一份旧版本的MATLAB(我想是MATLAB 5),而且不会违反许可证。我对它的功能很感兴趣,想知道它是否值得深入学习(为了通过考试,我只需要用到一些基础的MATLAB :P),在现实世界中,它是否在某些特定任务上真的比Python更好。

21 个回答

34

我在研究中使用Matlab已经很多年了。它在处理线性代数方面非常出色,并且有很多写得很好的工具箱。最近的版本开始向通用编程语言靠拢(比如更好的优化器、更完善的对象模型、更丰富的作用域规则等等)。

去年夏天,我有一个工作是用Python和numpy代替Matlab。我很享受这种变化。Python是一个“真正的”编程语言(这意味着很多东西),而且它有一些很棒的数值特性,比如数组广播。我也非常喜欢ipython环境。

以下是我更喜欢Matlab的一些方面:

  • 一致性:MathWorks花了很多精力让工具箱之间看起来和使用起来都相似。他们虽然没有做到完美,但在我见过的几十年历史的代码库中,这已经是最好的之一。
  • 文档:我发现要搞清楚numpy和/或python中的某些东西非常令人沮丧,因为文档的质量参差不齐:有些东西文档写得很好,有些则根本没有。当我看到一些看起来像Matlab的东西,但又不完全一样时,尤其令人沮丧。能够获取源代码是非常宝贵的(公平地说,大多数Matlab工具箱也附带源代码)。
  • 简洁性:对于我做的事情来说,Matlab的语法通常更简洁(但并不总是如此)。
  • 惯性:我现在有太多的Matlab代码需要更改。

如果我没有这么大的现有代码库,我会认真考虑转向Python和numpy。

38

大多数回答没有抓住重点。

Matlab之所以这么好用、这么受欢迎,主要有一个原因:

极快的编码速度

我是一名计算机视觉的博士生,已经使用Matlab四年了。在读博士之前,我用过C++、Java、PHP、Python等多种语言。大多数计算机视觉的研究者都只用Matlab。

1) 研究者需要快速原型

在研究环境中,我们(希望)经常会有新想法,我们想快速测试这些想法,看看是否值得继续深入。而且通常我们编写的代码中,只有一小部分是有用的。

虽然Matlab在执行时通常比较慢,但我们并不太在意。因为我们不知道哪种方法会成功,所以需要尝试很多东西,因此我们的瓶颈在于编程时间。我们的代码通常只会运行几次来获取结果,之后就可以发布了。

那么,Matlab是如何帮助我们的呢?

2) 所需功能都已经有了

Matlab有很多我需要的功能,这样我就不需要一直重新发明轮子:

将矩阵的索引转换为二维坐标:ind2sub;提取图像的所有块:im2col;计算图像的直方图:hist(Im(:));查找列表中的唯一元素:unique(list);将一个向量加到矩阵的所有向量上:bsxfun(@plus,M,V);对n维数组进行卷积:convn(A);计算代码某部分的运行时间:tic; %%code; toc;图形界面裁剪图像:imcrop(im)

这个列表可以非常长……而且通过帮助文档很容易找到这些功能。

Python中最接近的功能……但在Python中真的很麻烦,我每次都得去谷歌查找我需要的函数名,然后还得添加包,而这些包之间可能不兼容,矩阵的格式也会变,卷积函数只处理双精度浮点数,但如果我给它字符类型,它不会报错,只会给出错误的输出……真是让人头疼。

3) 集成开发环境(IDE)

举个例子:我启动一个脚本。因为一个矩阵出错了,它产生了错误。我仍然可以通过命令行执行代码。我用:imagesc(matrix)可视化它。我看到矩阵的最后一行有点奇怪。我修复了这个错误。所有变量仍然保持设置状态。我选择剩下的代码,按F9执行选中的部分,一切继续进行。调试变得很快,多亏了这一点。

Matlab在执行前会标记出我的一些错误,这样我可以快速看到问题所在。它还会建议一些方法来加快我的代码。

IDE中有一个很棒的性能分析工具。相比之下,KCahcegrind用起来就麻烦多了。

Python的IDE真是糟糕。没有ipython的Python根本无法使用。我从来没能顺利调试过,使用ipython时也是如此。

还有自动补全、函数参数帮助等功能……

4) 简洁的代码

为了规范化矩阵的所有列(我经常需要这样做),我可以这样写:

bsxfun(@times,A,1./sqrt(sum(A.^2)))

要从矩阵中删除所有小和的列:

A(:,sum(A)<e)=[]

在GPU上进行计算

gpuX = gpuarray(X); 
%%% code normally and everything is done on GPU

要并行化我的代码:

parfor n=1:100
%%% code normally and everything is multi-threaded

还有什么语言能比得上这个?

当然,我很少需要写循环,所有功能都包含在函数中,这让代码更容易阅读,也不需要为索引头疼。所以我可以专注于我想编程的内容,而不是如何编程。

5) 绘图工具

Matlab以其绘图工具而闻名。这些工具非常有用。

Python的绘图工具功能要少得多。但有一件事特别烦人。你只能在每个脚本中绘制一次图形???如果我有一个长脚本,就不能在每一步显示内容——>这太没用了。

6) 文档

所有内容都能快速访问,信息清晰明了,函数名称也选得很好。使用Python时,我总是需要去谷歌查找东西,看看论坛或StackOverflow……真是浪费时间。

附言:最后,我最讨厌Matlab的就是它的价格

77

亚当说得不完全对。很多数学家,甚至大多数,都不会去碰这个。如果真的用到计算工具,那通常是像MathematicaMaple这样的工具。相比之下,工程系的学生常常会依赖它,对一些应用数学家来说,它确实有用。在某些行业里,它的使用也很广泛。

你要知道,MATLAB最开始是为了封装Fortran的线性代数库而创建的。很长一段时间,它的理念是“世界就是一个浮点数的数组”。作为一种编程语言,它的发展非常自然,但如果你单纯把它当作编程语言来看,会发现它有一些固有的缺陷。

不过,如果把它看作是进行某些类型研究的环境,它的优势就显现出来了。对于浮点线性代数的处理,它几乎是最好的选择。它的符号简单而强大,运行速度快且可靠。它在生成图表和其他交互任务方面表现得非常出色。还有很多“工具箱”,里面有针对特定任务的优秀代码,价格也很实惠。用户社区也很庞大,大家分享数值代码(而Python加上NumPy目前还没有达到这个水平)。

尽管Python有一些缺点,但作为编程语言,它要好得多(还有很多其他语言也是)。不过,在工具方面,Python大约落后了十年左右。

关键是,大多数使用MATLAB的人其实并不是真正的程序员,也不想成为程序员。

作为一种通用编程语言,MATLAB并不是个好选择;它有些古怪,很多任务运行得比较慢(你需要对代码进行向量化才能提高效率),而且与外部世界的整合也不太容易。另一方面,对于它擅长的事情,它的表现非常出色,几乎没有其他工具能比。它背后有一家提供合理支持的公司,投入了多少人年也不清楚。这在工业界是很重要的。

从Python和MATLAB的比较来看,它们其实是针对不同工作而设计的工具。在它们有些重叠的领域,哪种更好很难说(这很大程度上取决于你想做什么)。但总体来说,Python在MATLAB的核心优势方面表现得并不好,反之亦然。

撰写回答