Mathematica 有哪些不如 MATLAB 的地方?
10 个回答
1.自我感觉Mathematica更容易崩溃(可能仅仅是我的个例)
就我最近的两个月使用最新版本Mathematica和Matlab(Mac OS El Capitan)来说,在难度差不多的复杂计算下Mathematica会有不少崩溃的情况,还有在导出为PDF时,有多矩阵显示时极其容易崩溃。
而且Mathematica一崩溃除非之前保存了,什么都没了,真的是什么都没了。
上周改了一行代码运行后全崩了,什么都没了啊!逼得我短时间内重写了代码。然后现在设置Mathematica为只要有output就自动保存了,好了很多。(这个功能默认是不开启的)
Matlab崩溃了都还保存的不错,迄今没发生严重的情况,而且想了想我Matlab真的似乎就从来不崩溃。
2.涉及矩阵的运算感觉不够顺手。(我不是Mathematica大牛,可能是自身水平所限)
上面也有人提过了Matlab基本完全基于矩阵,自然在这方面有极大优势。我就举个简单的例子,Mathematica中Cross[]命令算两个list的叉乘挺方便,但是针对矩阵形式的列向量就很憋屈了,逼得我用了一些其他弥补方式达到了这个功能。对应的Matlab中就太简单了。
如果有知友有好的方法也请告诉我哈,感谢了~
PS:当然这些劣势不阻挡我在某些场景下一定会强烈倾向于Mathematica
Mathematica里的For循环奇慢无比。
好了好了先别急着踩,我举这个例子只是想要提醒诸位,这个问题下的某些答案其实有着同样的问题——不,或许该说是题主在提问时对“不如”二字的界定不清。说得详细一点就是:“Mathematica在使用 某一具体思路 处理 某一问题 时不及MATLAB,但是在Mathematica里其实存在着与这所谓的 某一具体思路 截然不同的其他思路可以更有效率地处理这个 某一问题 ”的情况,算不算是“Mathematica不如MATLAB”?(你丫说人话!)
说得再具体一点,就是:Mathematica自带的debug工具是个渣(2016.12.29 我想我恐怕得收回这句话了,理由参看这里:
http:// note.youdao.com/share/? id=556026c5dda745eb3b9de92e4dac338b&type=note#/),但是它有具备优秀的动态交互能力的笔记本(.nb);Mathematica的正则或许不行(因为我对正则了解很有限,所以容我加上“或许”),但是它有自己的一套基于模式匹配的字符串处理工具。debug工具的问题,正则的问题,诸如此类的问题,真的该算进“不如”里去吗?
最后,为了避免这个答案彻底跑题,放一个我所见到的疑似Mathematica不如MATLAB的地方吧:
Mathematica内的至少是一部分 特殊函数 的数值算法 可能 不如MATLAB。(加“可能”是因为截止目前我只看到了一些间接证据,但我必须承认可能性不低。)
间接证据:
matlab - Numerical integration's speed numerical integrationnumerics - How to improve performance of BesselJ to the level of GSL?
(此问题和MATLAB无关,但它作为证据是最关键的:它表明Mathematica内置的BesselJ数值算法不够丰富。大家都知道MATLAB和Mathematica的许多数值算法背地里用的都是现成的函数库,前两帖里面的问题本质说不定就是这个。)
————————
@wolray匿名没法评论只好写这里了。
1 必须承认至少在探索性运算时我也时不时地会遇到这个问题,我个人的习惯是吃不准维度的时候就用Dimensions测一下,不过,WorkSpace其实属于“在Mathematica里没有但是(起码在实现一个不太复杂的版本时)实现起来并不困难”的内容,然后,WorkSpace在SE上其实有人写过,简单的到复杂的都有:
variable definitions。
2 “ 寄人篱下 的列表”这个说法我并不同意,如果说Mathematica的设计者真的是在通过这种输出方法强调什么的话,我宁愿认为这是在强调“矩阵也只是一种列表”,而 列表操作 可是Mathematica核心语言关键组成部分之一。另,其实关于这个有个非常简单的调节方法:
matrix - Why does MatrixForm affect calculations?。注意这里$PrePrint的改变只影响矩阵输出时的“外观”,所以不存在MatrixForm影响后续计算的问题。
3 找了个在线版Octave试了一会儿……如果我理解的不错的话,你的伪代码的完整版本应该是
a=1;
for i=1:4
a(i+1)=a(i)+1;
%执行完后a变为[1 2 3 4 5]
之类,那么,这一点所谈的内容其实很接近 Mathematica的AppendTo慢得掉渣 ——这个也属于分割线前所谈问题的一部分。
4 你需要Flatten以及Flatten的第四种语法或者ArrayFlatten:
$PrePrint = Replace[#, mat_?MatrixQ :> MatrixForm[mat]] &;