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 13; 5 10 11 8; 9 6 7 12; 4 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 官方网站
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 官方网站
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 官方网站
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/
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/
- 点赞
- 收藏
- 关注作者
评论(0)