Mathematica 有哪些不如 MATLAB 的地方?

求分条详细说明,有例子,配图就更好了。 鏡像問題 http://www.zhihu.com/question/327115554
关注者
244
被浏览
47,622

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 我想我恐怕得收回这句话了,理由参看这里:

note.youdao.com/share/?

),但是它有具备优秀的动态交互能力的笔记本(.nb);Mathematica的正则或许不行(因为我对正则了解很有限,所以容我加上“或许”),但是它有自己的一套基于模式匹配的字符串处理工具。debug工具的问题,正则的问题,诸如此类的问题,真的该算进“不如”里去吗?

最后,为了避免这个答案彻底跑题,放一个我所见到的疑似Mathematica不如MATLAB的地方吧:

Mathematica内的至少是一部分 特殊函数 的数值算法 可能 不如MATLAB。(加“可能”是因为截止目前我只看到了一些间接证据,但我必须承认可能性不低。)

间接证据:

matlab - Numerical integration's speed numerical integration
numerics - 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]] &;