Matlab替换的可行性研究

举报
Jet Ding 发表于 2020/09/28 18:34:51 2020/09/28
【摘要】 MATLAB可以进行矩阵操作,绘制函数和数据,实现算法,创建用户界面,并与其他语言编写的程序进行接口。

1      引言

这篇文章我们就来探索一下Matlab相关的知识。

2     Matlab

MATLAB(矩阵实验室)是MathWorks公司开发的多范式数值计算环境和专有编程语言。MATLAB可以进行矩阵操作,绘制函数和数据,实现算法,创建用户界面,并与其他语言编写的程序进行接口。

 

虽然MATLAB主要用于数值计算,但可选的工具箱使用MuPAD符号引擎,允许访问符号计算能力。另外一个额外的软件包Simulink增加了动态和嵌入式系统的图形化多域仿真和基于模型的设计。

 

截至2020年,MATLAB在全球拥有超过400万用户,MATLAB用户来自工程、科学和经济等不同背景。

2.1    语法

 

MATLAB应用程序是围绕MATLAB编程语言建立的。MATLAB应用程序的常见用法包括使用"命令窗口"作为交互式数学外壳或执行包含MATLAB代码的文本文件。

 

2.2       变量

 

变量是用赋值运算符=来定义的,MATLAB是一种弱类型的编程语言,因为类型是隐式转换的,它是一种推断类型的语言,因为变量可以被赋值而不声明它们的类型,除非它们要被当作符号对象,而且它们的类型可以改变。值可以来自常量,来自涉及其他变量值的计算,或者来自函数的输出。例如:

 

>> x = 17

x =

   17

 

>> x = 'hat'

x =

   hat

 

>> x = [3*4, pi/2]

x =

   12.0000    1.5708

 

>> y = 3*sin(x)

y =

   -1.6097    3.0000

 

2.3   向量和矩阵

使用冒号语法定义一个简单的数组:initial:increment:terminator。例如:


>> array = 1:2:9

array =

 1 3 5 7 9

 

上面的语句定义了一个名为array的变量,这个变量是一个由1、3、5、7和9组成的数组。也就是说,数组从1(初始值)开始,从前一个值开始,每增加一步就增加2(增量值),一旦达到9(结束值)就停止。

>> array = 1:3:9

array =

 1 4 7

 

增量值实际上可以不写(和一个冒号一起),此时使用默认值1

>> ari = 1:5

ari =

 1 2 3 4 5

 

给名为ari的变量分配一个数值为1、2、3、4和5的数组,此时默认值1被用作增量。

 

注意索引是基于1的,这是数学中矩阵的通常惯例,这不同于其他编程语言(如C、C++和Java)中常用的基于零的索引。


矩阵的定义可以通过用空格或逗号分隔一行的元素,并使用分号来结束每一行。元素列表应该用方括号[]包围。括号()用于访问元素和子数组(它们也用于表示函数参数列表)。

 

>> A = [16 3 2 135 10 11 89 6 7 124 15 14 1]

A =

 16  3  2 13

  5 10 11  8

  9  6  7 12

  4 15 14  1

 

>> A(2,3)

ans =

 11

 

指数集可以用表达式来指定,如2:4,它的值是[2,3,4]。例如,从第2行到第4行和第3列到第4列的子矩阵可以写成:

>> A(2:4,3:4)

ans =

 11 8

 7 12

 14 1

 

可以用函数eye生成大小为n的平方身份矩阵,可以用函数zeros和ones分别生成任意大小的带0或1的矩阵。

>> eye(3,3)

ans =

 1 0 0

 0 1 0

 0 0 1

 

>> zeros(2,3)

ans =

 0 0 0

 0 0 0

 

>> ones(2,3)

ans =

 1 1 1

 1 1 1

 

向量或矩阵的转置是通过函数transpose或在矩阵后面加点prime来完成的(如果没有点,prime将对复数数组进行共轭转置):

        

>> A = [1 ; 2],  B = A.', C = transpose(A)

A =

     1

     2

B =

     1     2

C =

     1     2

 

>> D = [0 3 ; 1 5], D.'

D =

     0     3

     1     5

ans =

     0     1

     3     5

 

大多数函数接受数组作为输入,并对每个元素进行元素化操作。例如,mod(2*J,n)将J中的每一个元素乘以2,然后将每一个元素模数化。MATLAB虽然包括标准的for和while循环,但是与其他类似的应用程序如R一样,它鼓励使用向量化的符号,并且通常执行起来更快。下面的代码,摘自函数magic.m,为n的奇数值创建一个魔方M(这里使用MATLAB函数meshgrid来生成包含1:n的方阵矩阵I和J)。

[J,I] = meshgrid(1:n);

A = mod(I + J - (n + 3) / 2, n);

B = mod(I + 2 * J - 2, n);

M = n * A + B + 1;

 

2.4   结构

MATLAB支持结构数据类型,由于MATLAB中所有的变量都是数组,所以更恰当的名称是 "结构数组",数组中的每个元素都有相同的字段名。此外,MATLAB还支持动态字段名, 可按名称查询字段、字段操作等。

2.5   函数

创建MATLAB函数时,文件的名称应与文件中第一个函数的名称相匹配。有效的函数名以字母开头,可以包含字母、数字或下划线。变量和函数是区分大小写的。

2.6   函数句柄

MATLAB通过引入函数句柄或函数引用来支持lambda微积分的元素,函数句柄可以在.m文件中实现,也可以在匿名或者嵌套函数中实现。

2.7   类和面向对象编程

MATLAB支持面向对象的程序设计,包括类、继承、虚拟调度、包、按值传递和按引用传递等,但其语法和调用约定与其他语言有很大不同。MATLAB有值类和引用类,取决于类是否有句柄作为超类(对于引用类)或不作为超类(对于值类)。

 

方法调用行为在值类和引用类之间是不同的。例如,对一个方法的调用:


object.method();


只有当对象是引用类的实例时,才能改变对象的成员属性。

值类方法如果需要修改对象,必须返回一个新的实例。

下面是一个简单类的例子:

 

classdef Hello

    methods

        function greet(obj)

            disp('Hello!')

        end

    end

end

 

上面代码放到一个名为hello.m的文件中时,可以用以下命令执行:

>> x = Hello();

>> x.greet();

Hello!

 

2.8     图形和图形用户界面编程

MATLAB具有紧密集成的图形绘制功能。例如,可以使用函数 plot 从两个向量 x 和 y 中生成图形,代码如下:


x = 0:pi/100:2*pi;

y = sin(x);

plot(x,y)

 

产生以下正弦函数的图形:

 

MATLAB也支持三维图形

 

[X,Y] = meshgrid(-10:0.25:10,-10:0.25:10);

f = sinc(sqrt((X/pi).^2+(Y/pi).^2));

mesh(X,Y,f);

axis([-10 10 -10 10 -0.3 1])

xlabel('{\bfx}')

ylabel('{\bfy}')

zlabel('{\bfsinc} ({\bfR})')

hidden off

 

 

以上代码可生成二维非归一化sinc函数的线框三维图        


 

[X,Y] = meshgrid(-10:0.25:10,-10:0.25:10);

f = sinc(sqrt((X/pi).^2+(Y/pi).^2));

surf(X,Y,f);

axis([-10 10 -10 10 -0.3 1])

xlabel('{\bfx}')

ylabel('{\bfy}')

zlabel('{\bfsinc} ({\bfR})')

 

以上代码可生成二维非标准化sinc函数的表面三维图。

 

MATLAB支持开发图形用户界面(GUI)应用程序。用户界面可以通过编程或使用GUIDE和App Designer等可视化设计环境生成。

2.9    与其他语言的接口

l  MATLAB可以调用用编程语言如C或Fortran编写的函数和子程序,创建一个包装函数,允许MATLAB数据类型被传递和返回。

l  MEX文件(MATLAB可执行文件)是通过编译此类函数创建的动态加载的对象文件。

l  自2014年开始增加与Python的双向接口。

l  用Perl、Java、ActiveX或.NET编写的库可以直接从MATLAB中调用,而且许多MATLAB库(例如XML或SQL支持)是作为Java或ActiveX库的封装器实现的。

l  从Java调用MATLAB比较复杂,但可以通过MathWorks单独出售的MATLAB工具箱来完成,或者使用一种称为JMI(Java-to-MATLAB接口)的未记录的机制来完成。

l  官方的MATLAB API for Java是在2016年添加的 。

l  作为MathWorks提供的基于MuPAD的符号数学工具箱的替代品,MATLAB可以与Maple或Mathematica连接。

l  也存在导入和导出MathML的库。

3      中国禁令

2020年中国国家媒体报道称,由于美国的制裁,MATLAB已经从两所中国大学撤回服务,并表示将通过增加使用开源替代品和开发国内替代品来应对。

4      替代品

接下来我们看一看Matlab的替代方案。

4.1   GNU Octave

如果你正在寻找在兼容性和计算能力方面更接近Matlab的东西,那么Octave是最好的Matlab替代品。大多数为Matlab开发的项目也可以在Octave上运行。它们可以在任何操作系统上运行,无需任何修改。

4.1.1    许可

GPL v3

4.1.2    最新版本

5.2.0 于2020年2月

 

4.1.3    官方网站

https://gnu.org/software/octave/

 

4.1.4    功能介绍:

l  它可以处理强大的数学语法,并配备了绘图和可视化工具。

l  开源,兼容所有操作系统。

l  主要为复杂的线性和非线性数值计算而开发

l  它可以运行交互式和批处理作业

l  兼容Matlab脚本和其他用Java、C++或Fortran编写的模块。

 

4.2   Scilab

Scilab是一个开源的类似于Matlab的实现。利用科学计算的近似技术来解决数值问题。为了达到这个目的,Scilab的开发者团队利用求解器和算法来建立代数库。Scilab和GNU Octave一样,是Matlab的主要替代品之一。

 

4.2.1    许可 

GPL v2

4.2.2    最新版本

6.1.0 于2020年2月

 

4.2.3    官方网站

http://www.scilab.org/

 

4.2.4    特征

Scilab的库文件基于以下几个方面。

 

l  数据分析

l  复杂算法的开发

l  以往计算的模型

 

数学计算的基础是:

 

l  递进和回归

l  傅立叶变换

l  微分和积分分析

l  常微分方程

 

数据可以通过以下任何一种方式进行可视化:

 

l  饼图

l  线型图、条形图

l  直方图

l  MathML注解

 

4.3  Maxima

替代Matlab的另一个选择是Maxima,它的灵感来自于传奇的代数系统Macsyma。

 

4.3.1    许可

GPL

4.3.2    最新版本

5.44.0 于2020年1月

 

4.3.3    官方网站

http://maxima.sourceforge.net/

 

4.3.4    特征

l  它是一个用于操作数值表达式的系统,如泰勒数列、拉普拉斯变换、向量、张力和矩阵。通过使用精确的浮动数、分数值和整数,可以提供非常精确的结果。

l  源代码可以在Windows、Mac OS等操作系统上编译。

l  可以在二维和三维中绘制数据和函数。

l  它是可以公开使用的。

l  Maxima经常进行更新,以消除错误和改进编码。

l  社区比较活跃。

 

4.4   SageMath

Sage Math是另一个软件系统,它提供了MatLab的替代方案。它用于分析大型数据集和为科学研究提供帮助。

 

4.4.1    许可

GPL v3

 

4.4.2    最新版本

9.1 于2020年5月

 

4.4.3    官方网站

 https://www.sagemath.org/

 

4.4.4    特征

l  建立在基于Python的科学库之上。

l  Python是清晰和易于阅读的。它在语法上与Matlab相似。

l  它提供了一个命令行界面和嵌入式工具来执行数学功能。

l  Sage的安装是免费的,并且可以定制。

l  我们可以在任何阶段添加模块。

l  Matlab基于其Fortran编译的库文件,从而可以更快地处理大型数据集。但Sage成本更低的,在时间框架上的微小滞后是可以忽略的。

 

4.5  Julia

Julia是一种高级的、高性能的、动态的编程语言,虽然它是一种通用语言,可以用来编写任何应用程序,但它的许多特点非常适合于数值分析和计算科学。

 

4.5.1    许可

MIT, GPL v2, GPL

 

4.5.2    最新版本

1.5.0-rc1于2020年6月

 

4.5.3    官方网站

https://julialang.org/

 

4.5.4    特征

l  简单的语法使其在数据分析中游刃有余。

l  它能够使用多个C和Fortran库代码。

l  它允许在分布式集群上并行或顺序地计算数据。

l  多重派遣(Dispatch)是Julia的一个特点,它结合了不同参数类型的功能行为。

l  通过调用Pyfunctions和C函数自动生成更专业的代码。

l  Julia利用了一个内置的包管理器。

l  测试代码可以通过交互式shell会话的REPL(Read-Eval-Print-Loop)进行快速的实验。

l  可以快速加载多维数据,并进行聚合、连接等功能。

l  它兼容其他接口,如Java、R等。

l  任何人都可以下载并运行Julia,安装也非常简单。

 

4.6  其他将数组作为基本实体的语言(数组编程语言)

l  APL

l  Fortran 90及以上

l  S-Lang,以及统计语言R和S

 

4.7  为现有的语言添加类似的功能

还有一些库可以为现有的语言添加类似的功能,比如:

 

l  NumPy/SciPy/matplotlib for Python

l  Perl数据语言

l  SciLua/Torch (Lua)

l  SciRuby (Ruby)

l  IT++ (C++)

l  ILNumerics (.NET)

l  Numeric.js (JavaScript)

 

4.8 MATLAB有许多商业竞争对手

4.8.1    Maple

Maple是一种符号和数值计算环境,也是一种多范式编程语言。它涵盖了符号数学、数值分析、数据处理、可视化等多个技术计算领域。工具箱MapleSim增加了多领域物理建模和代码生成的功能。

 

Maple在符号计算方面的能力包括通用计算机代数系统的能力。例如,它可以对数学表达式进行操作,并为某些问题找到符号解,如由普通和偏微分方程产生的问题。

 

Maple是由加拿大软件公司Maplesoft商业化开发的。Maple 这个名字是指该软件的加拿大血统。

https://www.maplesoft.com/products/Maple/

 

4.8.2    IDL

IDL是交互式数据语言的简称,是一种用于数据分析的编程语言,流行于天文学、大气物理学和医学成像等特殊科学领域。IDL与PV-Wave有着共同的语法,并且源于同一个代码库,不过后来这两种语言在细节上有了分歧。还有一些免费或无成本的实现,如GNU数据语言(GDL)和Fawlty语言(FL)。

 

https://www.harrisgeospatial.com/Software-Technology/IDL

 

4.8.3    Wolfram Mathematica

Wolfram Mathematica(通常称为Mathematica)是一个现代技术的计算系统,涵盖了技术计算的大部分领域--包括神经网络、机器学习、图像处理、几何学、数据科学、可视化等。该系统被应用于许多技术、科学、工程、数学和计算领域。它由Stephen Wolfram构思,并由伊利诺伊州香槟市的Wolfram Research公司开发,Wolfram语言是Mathematica中使用的编程语言

 

https://www.wolfram.com/mathematica/

 

5      参考

https://www.mathworks.com/products/matlab.html

https://opensource.com/alternatives/matlab

https://www.gnu.org/software/octave/

https://en.wikipedia.org/wiki/MATLAB

https://www.educba.com/matlab-alternatives/

https://alternative.me/matlab

http://freemat.sourceforge.net/

https://en.wikipedia.org/wiki/GNU_Octave

https://gnu.org/software/octave/

https://en.wikipedia.org/wiki/Scilab

http://maxima.sourceforge.net/

https://en.wikipedia.org/wiki/SageMath

https://en.wikipedia.org/wiki/Julia_(programming_language)

https://www.maplesoft.com/products/Maple/

https://www.wolfram.com/mathematica/

https://www.harrisgeospatial.com/Software-Technology/IDL

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。