我最近被要求学习一些类的MATLAB基础知识.
什么使研究人员和在大学工作的人如此酷?我看到使用矩阵和绘制事物很酷......(使用某些库可以在Python中轻松完成的事情).
编写函数或解析文件真是太痛苦了.我还在开始,我错过了什么?
在"真实"的世界里,我应该怎么想用呢?什么时候它应该比Python做得更好?为了更好,我的意思是:简单的方式来写一些表演.
更新1:我最想知道的一件事是"我错过了什么吗?" :d
更新2:谢谢你的回答.我的问题不是购买或不购买MATLAB.大学有可能免费给我一份旧版本的MATLAB(我猜的是MATLAB 5),而不会违反许可证.我对它的功能很感兴趣,如果它值得进行更深入的研究(我不需要通过基础 MATLAB来通过考试:P)它真的比Python更适合真实的特定任务世界.
亚当只是部分正确.许多(如果不是大多数)数学家永远不会触及它.如果有一个使用的计算机工具,它将会像Mathematica或Maple.另一方面,工程部门经常依赖它,对于一些应用数学家来说肯定是有用的.在某些领域,它也在工业中大量使用.
你必须要了解的关于MATLAB的一点是,它最初是作为线性代数的Fortran库的包装器.很长一段时间,它的态度是"全世界都是一系列双打(花车)".作为一种语言,它已经非常有机地发展,如果你把它看作是一种编程语言,那么它就有很多缺陷.
但是,如果将其视为进行某些类型研究的环境,它具有一些真正的优势.它与浮点线性代数一样好.该表示法简单而强大,实现快速且可信.它非常擅长生成绘图和其他交互式任务.有大量的"工具箱"具有适合特定任务的良好代码,价格合理.有一个庞大的用户社区共享数字代码(Python + NumPy在同一个联盟中没有任何东西,至少还有)
Python,疣和所有,是一种更好的编程语言(和许多其他语言一样).然而,就工具而言,它已落后十年左右.
关键是大多数使用MATLAB的人不是真正的程序员,也不想成为程序员.
对于通用编程语言来说,这是一个糟糕的选择; 它很古怪,很多任务都很慢(你需要对事物进行矢量化以获得有效的代码),并且不容易与外部世界集成.另一方面,对于它擅长的东西,它是非常好的.很少有比较的东西.有一家公司有合理的支持,谁知道投入了多少人年.这在工业中很重要.
严格来看你的Python与MATLAB的比较,它们大多是不同工作的不同工具.在它们确实重叠的区域,很难说最好的路线是什么(取决于你要做的事情).但是,大多数Python并不擅长MATLAB的核心优势,反之亦然.
大多数答案都没有说明问题.
有一个原因是matlab如此优秀且如此广泛使用:
我是一名计算机视觉博士生,并且已经使用matlab 4年了,在我的博士学位之前我使用不同的语言,包括C++,java,php,python ......大多数计算机视觉研究人员都使用专门的matlab.
在研究环境中,我们(希望)经常有新的想法,我们想要快速测试它们,看看它是否值得继续朝这个方向发展.而且大多数情况下,我们编码的内容中只有一小部分是有用的.
Matlab 在执行时通常较慢,但我们并不在意.因为我们事先不知道哪种方法会成功,所以我们必须尝试很多东西,所以我们的瓶颈就是编程时间,因为我们的代码通常运行几次才能将结果发布,这就是所有.
那么让我们看看matlab如何提供帮助.
Matlab确实有很多我需要的功能,所以我不必一直重新发明它们:
将矩阵的索引更改为2d坐标:ind2sub
提取图像的所有补丁:im2col
; 计算图像的直方图:hist(Im(:))
; 找到列表中的唯一元素unique(list)
; 向矩阵的所有向量添加向量bsxfun(@plus,M,V)
; n维数组上的卷积convn(A)
; 计算代码的子部分的计算时间:tic; %%code; toc
; 用于裁剪图像的图形界面:imcrop(im)
;
列表可能很长......而且使用帮助很容易找到它们.
最接近它的是python ......但是这只是python中的一个痛点,每次我都要去谷歌寻找我需要的功能的名称,然后我需要添加包,并且包不兼容一个与另一个,矩阵的格式改变,卷积函数只处理双精度但是当我给它char时不会出错,只是给出错误的输出...没有
一个例子:我启动一个脚本.由于矩阵,它会产生错误.我仍然可以使用命令行执行代码.我把它想象成:imagesc(matrix)
.我看到矩阵的最后一行很奇怪.我修复了这个bug.所有变量仍然设置.我选择剩余的代码,按F9执行选择,一切都继续.由于这个原因,销售变得很快.
Matlab在执行之前强调了我的一些错误.所以我可以很快看到问题所在.它提出了一些方法来加快我的代码.
IDE中包含一个很棒的分析器.与此相比,KCahcegrind使用起来非常痛苦.
python的IDE非常好.没有ipython的python不可用.我从未设法使用ipython进行调试.
+自动完成,帮助函数参数,...
为了规范化矩阵的所有列(我一直需要它),我做:
bsxfun(@times,A,1./sqrt(sum(A.^2)))
要从矩阵中删除所有小数量的colums:
A(:,sum(A)
要在GPU上进行计算:
gpuX = gpuarray(X); %%% code normally and everything is done on GPU
为了平衡我的代码:
parfor n=1:100 %%% code normally and everything is multi-threaded
用什么语言可以打败那个?
当然,我很少需要创建循环,所有东西都包含在函数中,这使代码更容易阅读,并且没有索引的头痛.所以我可以专注于我想要编程的内容,而不是如何编程.
Matlab以其绘图工具而闻名.他们非常有帮助.
Python的绘图工具功能要少得多.但有一件事太烦人了.每个脚本只能绘制一次数字??? 如果我有脚本我不能在每一步显示东西--->无用.
一切都很快访问,一切都很清晰,功能名称很好选择.使用python,我总是需要谷歌的东西,看看论坛或stackoverflow ....完成时间的猪.
PS:最后,我讨厌matlab:它的价格
在我的研究中,我一直在使用matlab多年.它非常适合线性代数,并且拥有大量精心编写的工具箱.最新版本开始将其推向更接近通用语言(更好的优化器,更好的对象模型,更丰富的范围规则等).
去年夏天,我有一份工作,我使用Python + numpy而不是Matlab.我很喜欢节奏的变化.它是一种"真正的"语言(并且所有这些都需要),它具有一些很棒的数字功能,如广播阵列.我也非常喜欢ipython环境.
以下是我更喜欢Matlab的一些内容:
一致性: MathWorks花费了大量精力使工具箱看起来像彼此一样工作.他们没有做得很完美,但它是我见过的最好的代码库之一,已经有几十年了.
文档:我发现在numpy和/或python中找出一些东西是非常令人沮丧的,因为文档质量很不稳定:有些东西记录得很好,有些东西根本没有.当我看到那些看起来模仿Matlab的事情,但不这往往最令人沮丧的相当的工作方式相同.能够获取源是非常宝贵的(公平地说,大多数Matlab工具箱也附带源代码)
紧凑性:对于我的工作,Matlab的语法通常更紧凑(但并非总是如此)
势头:我现在有太多的Matlab代码需要改变
如果我没有这么大的现有代码库,我会认真考虑切换到Python + numpy.
抓住一切.你最后一次编程计算器来玩俄罗斯方块的时候是什么时候?你真的认为你可以在那些128k的RAM中写下你想要的东西吗?可能不是.除非您处理大型矩阵,否则MATLAB不用于编程.当你有兆字节到千兆字节的数据进行处理和/或绘图时,它就是你的图表计算器.学习基本的东西,但也不要试图让Python成为图形计算器.
您可以快速了解何时想要在MATLAB中进行处理,绘图或探索,以及何时想要获得所有Python提供的内容.许多工程师转而使用Python或Perl进行前后处理.偶尔甚至只是向MATLAB呼叫硬比特.
它们是完全不同的工具,你应该首先学习它们的基本优势,而不是试图用另一个替换它们.为了节省金钱,我要么使用Octave,要么轻松使用,并学会使用Perl或Python中的稀疏矩阵.
MATLAB非常适合进行数组操作,执行专门的数学函数以及快速创建漂亮的图.
如果我可以使用大量的数组/矩阵操作,我可能只会将它用于大型程序.
您不必像在更正式的软件包中那样担心IDE,因此对于没有大量编程经验的学生来说更容易接受.
MATLAB是一种流行且广泛适用的复杂软件包.认为它只是一个数学软件是错误的,因为它有各种各样的"工具箱".我最近使用Matplotlib来绘制数据库中的一些数据,它完成了这项工作,而不需要MATLAB的所有功能.但是,在每种情况下比较Python和MATLAB可能都不合适.与其他一切一样,决定取决于您需要做什么.
我在本科中使用MATLAB进行控制系统设计和仿真,以及研究生院的图像处理.对于这些领域,MATLAB最有意义,因为它具有强大的控制和图像处理工具箱.正如大家所提到的,使用MATLAB的每个MATLAB脚本中使用的数组操作都非常简单.
MATLAB的另一个好处是,使用内置工具箱功能进行原型设计和尝试创意非常简单快捷.例如,它不需要任何工作来导入图像并计算它的直方图或对其进行一些简单的处理.MATLAB的一个缺点可能是它的速度,因为它的解释性质.但是,如果一个人真的需要速度,他可以选择在C/C++等中实现测试逻辑.
为了进一步与Python比较,我可以说MATLAB为您提供了一个完整的包,无需寻找外部库和实现额外的功能.
关于MATLAB的最后一点,我在这里的答案中没有提到,它有一个非常强大的可视化建模/模拟环境,称为Simulink.使用Simulink设计和模拟更大的系统更容易.
最后,这一切都取决于您需要解决的问题.如果您的问题域可以使用MATLAB的工具箱之一并且您可以访问MATLAB,那么您可以确定您将拥有解决它的正确工具.
正如其他人所提到的,MATLAB在矩阵操作方面非常出色,最初是作为用于线性代数的着名BLAS和LAPACK库的扩展而构建的.它与Java等其他语言很好地接口,并且由于其开发和记录的库而受到工程和科学公司的青睐.据我所知的Python和NumPy,虽然它们共享MATLAB的许多基本功能,但它们的库并没有完整的广度和深度.
就个人而言,我使用MATLAB,因为这是我在实习中学到的,这就是我在研究生院学到的东西,这就是我在第一份工作中所使用的东西.我没有任何反对Python(或任何其他语言)的东西.这也是我用过的东西.
此外,还有另一个免费版本,除了@ Jim C从gnu 提到的称为Octave的 scilab .
就个人而言,我倾向于认为Matlab是一个交互式矩阵计算器和绘图工具,具有一些脚本功能,而不是像Python或C这样的完整编程语言.它成功的原因是矩阵的东西和绘图工作的盒子,你可以做几件非常具体的事情,几乎没有实际的编程知识.正如您所指出的,对于更通用的任务,例如最简单的字符串处理,这种语言非常令人沮丧.它的语法很古怪,并且它不是为超过100行左右的项目所需的抽象创建的.
我认为人们尝试使用Matlab作为一种严肃的编程语言的原因是大多数工程师(有例外;我的学位是生物医学工程,我喜欢编程)是可怕的程序员,讨厌编程.他们在大学教Matlab主要用于矩阵数学,他们学习一些基础编程作为学习Matlab的一部分,并且假设Matlab足够好.我想不出任何我认识的人除了Matlab之外谁知道任何语言,但仍然使用Matlab进行除了一些纯数字运算应用之外的任何事情.
它在大学中被如此广泛使用的最可能的原因是数学教师习惯了它,理解它,并且知道如何将它融入他们的课程中.
在matplotlib + pylab和NumPy之间我不认为除了@Adam Bellaire建议的文化惯性之外,Matlab和python之间存在很多实际差异.
我相信你有一个非常好的观点,这是我工作的公司中提出的一个.由于涉及许可成本,公司在应用matlab方面的能力有限.一位开发人员证明Python是一个非常合适的替代品,但它落在了无知的耳朵上,因为那些耳朵的主人......
公司中没有人知道Python,尽管我们很多人都想使用它.
MatLab有一个名称,公司和背后的任务组来解决任何问题.
有一些(但不是很多)遗留的MatLab项目需要重新编写.
如果价值10,000英镑(??),那就值得了!
我在这里和你在一起 Python是MatLab的非常好的替代品.
我应该指出,我被告知公司可能使用MatLabs 5%到10%的功能,这是我与原始海报达成协议的基础
MATLAB是一个很棒的工具
原型
工程仿真与
快速可视化数据
您可以非常有效地在数据集上玩,可视化和测试您的想法.它不应被视为用于产品开发的其他软件语言的替代品.我强烈推荐它用于上述任务,虽然价格昂贵 - 像Octave和Python 这样的免费替代品正在迎头赶上.
似乎是纯惯性.在使用它的地方,每个人都忙于学习IDL或numpy足够详细的切换,并且不想重写好的工作程序.幸运的是,这并不是严格意义上的,但在足够多的地方确实足够Matlab将会存在很长时间.像Fortran一样(在我工作的地方活跃使用!)