MATLAB对于Python程序员的介绍

16

我以前断断续续地使用过MATLAB,但现在我需要全面了解它,而我最熟悉的语言是Python。请描述一下MATLAB语言特性、习惯用法、最佳实践或哲学与Python相比的异同之处?

很多人都在谈论和提供从MATLAB到(Python + 工具)的转换,但这不是我需要的方向。那么,我应该交换哪些数据结构,应该使用哪些类,NumPy的直觉可能会出错的地方在哪里等等?


3
将MATLAB视为PC上口袋计算器的仿真,其语言特性来自70年代,并非常基础。较新的OO等特性是模仿Python而来,但由于性能原因实际上不太可用。 - Mikhail Poda
2
同意 @Mikhail 的观点。除了基本的矩阵操作以外,其他都像是一个设计不良的黑客手段。 - Seth Johnson
我不知道 @Mikhail 用的是什么型号的口袋计算器,但这个比喻太过荒谬了。这就像把一艘四桅帆船和一个小舢板相提并论一样。我认为 MATLAB 的面向对象模型不是基于 Python 的,它们的类定义非常非常不同。真正的情况是 NumPy、Matplotlib 和其他 Python 包最初是以 MATLAB 为蓝本建模的。 - Cris Luengo
6个回答

7
文档是MATLAB的优点之一。如果您需要使用MATLAB,最好的起点之一是“Getting Started”部分。其中有些内容可能对您来说太基础了,但这比太高级要好得多,它将向您展示语言的最重要方面。
您需要注意的一件事是,MATLAB从1开始索引。对于MATLAB程序员可能需要注意的其他方面,您可以查看this question的答案。
如果您需要用MATLAB完成特定任务,则帮助提供了许多演示文稿,应该能帮助您找到正确的路径。

Matlab提供的许多IDE功能,如调试器,对我来说是非常有帮助的。我最喜欢的事情就是它提供了很多帮助,如果我需要找到某个内置函数,它也非常容易找到。 - Thomas
@Thomasballinger:我编辑了一个有关程序员使用Matlab的相关问题链接。 - Jonas
我终于在我的个人资料中添加了联系信息,所以每当教程处于您愿意分享的状态时,请告诉我。谢谢! - Thomas
在提到的教程中,有很好的链接和观点 - 我会很快在这个问题中发布更多的链接。 - Thomas
矩阵、索引等在我看来非常相似。我遇到困难的是其他类型,比如setdict和尤其是list(也许还有一般的对象)。在Python中,任何东西都可以放在列表中,可以循环它并将其简单地转换为矩阵。在MATLAB中,可能会使用一个单元格,但它的工作方式有些不同。因此,“如何为Python程序员使用单元格”将非常有帮助。 - embert

6

这些“翻译”非常好,因为它们可以双向工作,但讨论Matlab的工作原理会更理想。 - Thomas
我明白你的意思,不幸的是,我不知道有哪些特定的书籍或教程,但我已经更新了答案,并添加了一些你可能会觉得有用的链接。 - ars

3
  1. MATLAB 的文档非常好。在所有人都抱怨 X 文档有多么糟糕的世界中,我认为 MATLAB 的文档对其受欢迎程度做出了重要贡献。Python 的文档也很好,但 MATLAB 的文档感觉更加容易理解。可以看出 Mathworks 对此进行了一些关注。

  2. 在 MATLAB 中,矩阵是基础。如果在工作空间中执行 x = 3,则可以对 x 进行矩阵操作(尽管可能没有意义),如转置、逆、特征分解等。无需进行类型转换。在 Python/NumPy 中,仍需要使用 scipy.matrix 将数组转换为矩阵后才能执行矩阵操作。

  3. 我不熟悉 MATLAB 是否有类似于 Python 之禅(即 import this)的明确流派。但许多特点相似:易于实验、开发时间快、易于调试和分析、高级、可扩展。

  4. MATLAB 不像 Python 那样强调面向对象。在 MATLAB 中仍然可以使用 OO(例如,支持类),但我不知道有多少人使用它。

  5. 我喜欢以以下方式思考:NumPy 就像 MATLAB 的核心,SciPy 就像 MATLAB 的工具箱,Matplotlib 让您像 MATLAB 一样绘图,iPython 就是 MATLAB 工作区。

  6. 哦,对了...MATLAB 从 1 开始索引,而不是从零开始!这是 MATLAB 的基本思想的逻辑结果,在线性代数中,矩阵通常从 1 开始索引。


2
几个性能问题:
  1. 不要使用类:MATLAB 类非常慢。

  2. 不要使用 for 循环:学习如何向量化操作。MATLAB 在向量化函数方面速度快,而在执行 for 循环时极其缓慢。


  1. 不要使用笼统的陈述。所有编程语言都有其局限性。类和for循环在许多特定应用中是可以接受的,甚至根据许多标准来说更好。与任何事物一样,关键是学会何时以及如何将它们应用于特定问题。简单地说“不要”并不能提供细致有用的答案。
- horchler
是的,请避免使用for循环。不幸的是,MATLAB文档在这一点上很简洁。 - Peter Mortensen

1

你不能直接对函数结果进行索引;

from numpy import *
sin(array(range(10))*pi/10)[3]

MATLAB中无法工作;你需要先保存结果:

x = sin(0:pi/10:pi)
x(3)

这是来自Jonas的教程。


0

Ballinger:如果你有兴趣,我最终可以给你发送我制作的(简短的)教程。 - Jonas
好的,谢谢。如果可以的话,我会在这里发布一些对于Python转Matlab最相关的指针。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接