幸存的MATLAB和R作为顽固的程序员[关闭]


25

我喜欢用似乎适合硬核程序员的语言进行编程。(我最喜欢的是Python和D。)MATLAB是为工程师而设计的,R是为统计学家设计的,看来这些语言是为那些不是硬核程序员并且不像硬核程序员那样思考的人设计的。我总是觉得它们使用起来有些尴尬,在某种程度上,我无法理解为什么。这是我设法确定的一些问题:

  • (两者):在没有真正原语的情况下,极端强调向量和矩阵。
  • (两者):基本字符串操作的难度。
  • (两者):对基本数据结构(如哈希表和“实数”,即类型参数和可嵌套数组)的支持缺乏或尴尬。
  • (两者):即使按照解释语言标准,它们也确实非常慢,除非您向后弯腰以对代码进行矢量化处理。
  • (两者):它们似乎并非旨在与外界互动。例如,这两个程序都是相当庞大的程序,需要一些时间才能启动,并且似乎没有设计成使简单的文本过滤器程序易于编写。此外,缺乏良好的字符串处理能力使得文件I / O几乎不可能以任何非常标准的形式出现。
  • (两者):面向对象似乎具有很强的固定感觉。是的,您可以做到,但是在C语言中,它比OO更加习惯。
  • (两者):没有明显,简单的方法来获取引用类型。没有指针或类引用。例如,我不知道您如何使用这两种语言滚动自己的链接列表。
  • (MATLAB):您不能将多个顶级函数放在一个文件中,因此建议使用很长的函数并进行剪切和粘贴编码。
  • (MATLAB):整数显然不存在为一流的类型。
  • (R):基本的内置数据结构似乎太高级了,文档却很少,并且鉴于我在类似但较低级别的数据结构上的经验,似乎从未达到我期望的效果。
  • (R):该文档散布在各处,几乎无法浏览或搜索。就我所知,即使D通常因不良的文档而被淘汰,但仍然相当残破。
  • (R):至少据我所知,没有好的IDE。同样,即使是D,这是一个社区规模较小的相当Alpha的语言,其效果也更好。

总的来说,如果存在足够全面的库,我还希望可以用通用语言将普通的旧库轻松替换为MATLAB和R。在更新的通用语言中尤其如此,其中包括许多面向库作者的功能。

为什么R和MATLAB在我看来如此奇怪?您是否注意到其他任何主要问题,可能会使这些语言对铁杆程序员变得陌生?当需要使用它们时,有哪些好的生存技巧?

编辑:从我得到的一些答案中我看到一个问题。当我分析数据时,我强烈希望拥有一个包含整个管道的脚本。这意味着需要使用通用语言。我讨厌不得不编写一个脚本来“清理”数据并将其吐出,然后再编写一个脚本以在完全不同的环境中将其读回,等等。我发现在某些工作中使用MATLAB / R和一个完全不同的语言具有完全不同的地址空间和思维方式,其他语言将成为巨大的摩擦源。此外,我知道存在胶合层,但是它们似乎总是非常复杂并且是摩擦的根源。


40
python是为“铁杆”程序员编写的吗?那是什么时候发生的?
TZHX 2011年

3
@TZHX:好的,也许铁杆是错误的词。更好的用语是“像程序员一样思考的人”。
dsimcha 2011年

17
我真的不喜欢“核心程序员”一词。听起来好像某种形式的精英主义,而“通用程序员”一词足以说明同一点。
blubb 2011年

5
您抱怨R和Matlab不适用于硬核程序员,但是您抱怨的是,您不够硬核不能使用R和Matlab。如果您想使用非Algol家族的语言编写,则必须考虑其用语。
彼得·泰勒

5
e,我的第二种编程语言是汇编语言。Python的不是硬核-它是在精确同一水平R和Matlab的。假设它与众不同是对Python的了解不多。Matlab之所以出色,是因为Mathworks简化了许多工作。R之所以出色,是因为无与伦比的统计,机器学习,数据准备,分析和可视化工具(也称为统计)。Perl出色的b / c ...就像我一样-了解所有知识并为工作选择合适的人。:)
Iterator

Answers:


29

以整体编程或使用通用语言编程通用程序所需的思维方式来处理特定于领域的语言,这可能不是一个好主意。由于是特定于领域的,因此可能需要更陡峭的学习曲线和不舒服的思维定式才能最有效地使用。我认为用Matlab编写代码等同于编写高度优化的领域特定代码(例如,与编写高效,简洁的OpenGL代码相当)。我还看到它们越来越多地变得有用,因为它们可以用作其他语言的库-例如,请参阅http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

我要说的是,对这些DSL使用与对其他DSL相同的过程:

  • 仔细选择使用Matlab或R解决的问题,以确保它们恰好是他们最能解决的问题。例如,如果可以避免,请使用Matlab来操纵向量,而不是在其余工作中使用
  • 通常,将解决方案混合/匹配,以将您在Matlab或R中编程的部分限制为它们要处理的确切问题子集。
  • 在设计和构建解决方案时,请遵循语言所针对的领域中的典型用户的思维方式-例如,在开始使用Matlab程序之前,先对世界采用向量数学的态度;可能首先使用标准数学符号将您的工作写在纸上
  • 进行额外的工作以建立一个舒适的工作环境,并获得完成工作所需的工具,即使与DSL标准不同。例如,如果您是emacs用户,请考虑对emacs使用matlab模式来完成您的工作;确保它与您为其他语言设置的模式一样好
  • 准备退出。特别是如果您必须经常使用该语言,请确保建立一个可靠的生态系统,其中您在DSL中所做的工作仅包含在特定于域的工作中,并且尽可能容易地切换到另一种语言以用于剩下的工作。比平时更频繁地提醒自己,寻找在其他系统中完成非DSL特定工作的方法

3
您说的很合理,通常是我必须使用Matlab或R时的工作方式。令人沮丧的部分是由于必须将多种语言与多种处理方式和多个地址空间集成在一起而引起的摩擦。通常,这涉及到在看似任意的点将内容转储到文本文件中并读回,或者使用一些易碎,丑陋且难以配置的胶合层。
dsimcha'1

25

首先,我要熟悉MATLAB,但不熟悉R。

MATLAB在OO,字符串处理或自定义数据结构方面表现不佳的原因是,它并不意味着要做这些事情。有很多面向对象的语言,很多可以很好地处理字符串,还有很多支持疯狂的自定义数据类型。它们都不擅长矩阵乘法,因为它们不是为此而设计的。

仅优化MATLAB要做的向量和矩阵运算就足够困难,而无需处理用户定义的类型或指针或其他类型的指针(如果不困难,它们将无法为此承担太多费用)。向现有的通用语言添加快速向量支持也很难--这增加了很少程序员将要使用的功能的大量开销(太少的程序员理解链接列表,他们应该如何使用特征值分解? )。

MATLAB对您是如此陌生,因为它旨在让科学家和工程师非常快速地进行矩阵乘法和ODE计算。MATLAB不能满足您对“硬核”语言的定义,因为它从来都不应该做到。尝试用Python或D来考虑MATLAB就像用C来考虑LISP或Haskell或用JavaScript来考虑Verilog和VHDL一样-它们解决了不同的问题,并且以根本不同的方式解决了问题。公平地讲,MATLAB做出了一些(好的,很多)奇怪的语言设计选择,即使从特定领域的语言的角度来看,我也无法忍受。但是,没有特别的理由为什么天文学家应该关心天体X与天体Y的距离恰好是48 AU,而不是48.0 AU。

现在,值得庆幸的是,确实有一些图书馆按照您的建议来做:对通用语言的科学计算提供了很好的支持。对于Python,有NumPy / Matplotlib,它具有一些粗糙的边缘,但是在Python内部提供了合理的MATLAB功能。之所以没有其他这样的项目,是因为这些库难以编写,难以服务于MATLAB和FORTRAN已经涵盖的市场。

如果绝对必须使用MATLAB或R,则不能像“硬核”程序员那样对它们进行编程,而必须像“硬核”科学家或工程师那样对它们进行编程。对于LISP,您必须考虑递归。在MATLAB中,您只需要考虑矩阵。复习线性代数(麻省理工学院关于该主题的讲座是一个很好的回顾)。否则,“生存” MATLAB的唯一方法是实践中认识到何时可以用矢量运算代替循环,或者何时您的问题因寻找外部乘积的特征值而减少。


是的,总体而言,我喜欢Numpy / Scipy / Matplotlib,并且只要有明显的替代方案是MATLAB / R,就可以使用它们。我对此的唯一抱怨是,它们不如MATLAB / R那样深,并且由于它们是Python,因此它们仍然有些慢。
dsimcha 2011年

4
@dsimcha,这实际上不正确的。在这项性能研究中,Numpy与MATLAB相当,而Pyrex的C ++系数仅为2倍。
wvoq 2011年

@wvoq:澄清:我的意思是Python解释器很慢,而不是Numpy。我知道Numpy主要是BLAS和LAPACK的包装器,它们很快。当然,调用此代码仍然有固定的开销。我也知道Pyrex,Cython等,它们确实可以提供帮助,但是您仍在细粒度地混合语言,这仍然可能引起摩擦。
dsimcha 2011年

2
@dsimcha,调用Numpy的开销实际上是一个常数。在我提到的性能研究中,使用C ++可以节省十分之几秒的时间。必须将这段时间与编写和调试,以及调试BLAS调用所花费的时间进行比较。问为什么不用汇编语言编写所有内容可能很有启发性。甚至是直接的机器代码,因为从汇编到机器代码的转换会增加一些固定的开销?
wvoq 2011年

3
@dsimcha嗯?您想用一种(快速)语言来做所有事情,最喜欢Python,然后又抱怨Python运行缓慢?那么,重点是什么。我猜您只是想让MATLAB具有更多的通用功能并且比解释型语言更快?
克里斯说,请

14

您反复引用术语“核心程序员”作为参考。以及您对R和MATLAB的设计者并非如此的怀疑,使我感到非常愚蠢,并鼓励人们不要认真对待您的批评。

如果您想认真阅读R的一些批评,最好阅读R的设计师之一Ross Ihaka撰写的这篇文章。对我来说,设计 R 似乎比使用 D或Python 困难得多。


2
-1。我从来没有暗示过,MATLAB和R的设计师不是非常好的硬核程序员。但是,MATLAB和R不是铁杆程序员设计的。
dsimcha 2011年

3
“……这些语言似乎是由并非核心程序员并且不像核心程序员那样思考的人设计的。”
wvoq 2011年

6
您仍然没有弄清什么是“核心程序员”。以您的示例为例,“硬核”听起来仅意味着“最适合C ++”,在这种情况下,R和MATLAB从定义上讲就不是硬核。您几乎所有的示例都减少了对这些语言不是您习惯的抱怨,而又不问为什么这些领域的专家认为适合采用这种语言。
wvoq 2011年

1
另外,就定义而言,我认为这很明显,但是“硬核程序员”只是熟悉基本编程概念(例如引用/指针,面向对象,lambda函数,基本数据结构等)的人,并且用于开发以通用语言。
dsimcha 2011年

2
首先,如果要表示“熟悉oo /过程/功能编程中的基本概念的人”,那么“硬核”是一个很漂亮的术语。其次,我不能说MATLAB,但是R具有所有这些东西。唯一的区别是,在R中,语言会鼓励您以使统计词汇表的元素成为您的原语的方式提出问题。原因是统计学家和机器学习人员经常会以这种方式轻松表达问题,即使您对“更核心”的东西感到满意,这也使得R自然而然地适合您。
wvoq 2011年

9

在没有真正原语的情况下,极端强调向量和矩阵。

这取决于您所说的真正的原语。在R中,向量是真实的图元;也就是说,所有变量都是向量。同样,在MATLAB中,所有变量都是矩阵。

基本字符串操作的难度。

在MATLAB中,字符串操作功能强大,但我同意代码通常很丑陋且不直观(至少目前如此)。对于R,有一个stringr软件包,它与任何其他语言的工具一样好用。

对基本数据结构(例如哈希表和“实数”,即类型参数和可嵌套数组)的支持缺乏或尴尬。

在R中,向量的名称类似于哈希。还有hashfilehash包。不确定MATLAB的实现,但是您可以根据需要轻松调用JAVA或.NET版本。

即使按照解释语言标准,它们也确实非常慢,除非您向后弯腰以对代码进行矢量化处理。

一旦掌握了向量化的技巧(如果您确实是骨灰级的话,我敢肯定,您肯定会这么做的),您将诅咒在返回其他语言时必须使用循环。执行速度是编程速度的折衷。

他们似乎并非旨在与外界互动。例如,这两个程序都是相当庞大的程序,需要一些时间才能启动,并且似乎没有设计成使简单的文本过滤器程序易于编写。此外,缺乏良好的字符串处理能力使得文件I / O几乎不可能以任何非常标准的形式出现。

它们都可以几乎任何格式读取和写入数据。都可以从大多数其他编程语言中调用它们。或从命令提示符下。您可以使用它们创建GUI。那怎么不与外界互动呢?如果您在使用文本过滤器程序时遇到困难,请询问stackoverflow。

面向对象似乎具有很强的固定感觉。是的,您可以做到,但是在C语言中,它比OO更加习惯。

同意 它们主要是程序语言。

没有明显,简单的方法来获取引用类型。没有指针或类引用。例如,我不知道您如何使用这两种语言滚动自己的链接列表。

在R中达成协议。在MATLAB中,引用称为句柄。

您不能将多个顶级函数放在一个文件中,而鼓励使用很长的函数并进行剪切和粘贴编码。

废话。只需创建多个文件。

整数显然不存在为一流的类型。

他们是这样。见int8int16int32int64

基本的内置数据结构似乎太高级了,文档编写得很差,并且鉴于我在类似但较低级别的数据结构上的经验,似乎从未达到我期望的效果。

它们适合进行数据分析。请举例说明意外行为。

该文档散布在各处,几乎无法浏览或搜索。就我所知,即使D通常因不良的文档而被淘汰,但仍然相当残破。

有很多文档。开始?some_functionRSiteSearch('some concept')rseek.orgsos包装。更不用说安装随附的手册了。还是一本好书

至少据我所知,没有好的IDE。同样,即使是D,这是一个社区规模较小的相当Alpha的语言,其效果也更好。

尝试使用Architect或RStudio或Revolution Analytics IDE。有关链接和更多选项,请参见“ 堆栈溢出”信息页面的 “ R的IDE和编辑器”部分。


3

MATLAB可以与Java和C / C ++集成。您可以使用这些语言实现所有非数字工作量,然后从MATLAB调用它们。

使用它们是必要的

是否有必要这样做的原因?您是否正在使用别人编写的现有MATLAB代码库?是工作要求吗?(如果您在学校,则为课程要求),否则,您可以考虑使用SciPy或NumPy。

不幸的是,根据我个人的观点,如果这种情况被强加给某人,那么它并不总是可以生存的。即使在大学,也不是每个工程专业的学生都能适应MATLAB的计算思维方式。


2
我知道这些解决方案,但它们似乎倒退了。我想从C ++,Java等调用MATLAB,而不是相反。除了MATLAB外,我想成为我的“驱动程序”语言。
dsimcha 2011年


0

我使用MATLAB,Python和C(有时甚至是C ++)进行工作,我认为自己(主要是)是软件开发人员,与倾向于数据科学家,数学家或其他领域专家的同事坐在一起。

尽管我将第一个承认它不是C或Python的通用编程语言,但是我实际上非常喜欢用MATLAB编写脚本,特别是对于时间序列分析或图像处理之类的脚本。

该语言有几个功能,尽管通常效率很低,但使用起来却很有趣。例如,进行逻辑索引:我可以创建一个逻辑矢量或矩阵来选择感兴趣的区域,并将其命名为“ isInROI”,执行过滤操作以从该区域的矢量或矩阵“数据”中选择元素是那么只需写一个问题:“ roiData = data(isInROI)”。

正是这样的时刻真正使我欣赏MATLAB,并让我忽略了它的其他许多无数的过失。


需要注意的是numpy的具有逻辑索引,以及:docs.scipy.org/doc/numpy/user/...
jarondl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.