Matlab是什么?是计算领域的经典VB,他们分别在各自领域处于鄙视链的最底层。
当然,这个鄙视链是程序员的鄙视链,对于不想对编程有深入了解的人,可以无视,更没必要继续看本文了。但考虑到动则小百万的价格,对于不想或者无法脱离Matlab的朋友,这里推荐用Octave——一个与Matlab语法几乎相同的开源计算工具。
基本差异
注释方案:Matlab中用% ,Python用# 。
Matlab的索引默认从1开始,通过() ;Python则从0开始。用[] 。
python中的字符串通过单引号或者双引号表示。
循环和判断
matlab通过end 来终结一段代码,而python则通过缩进来表示作用域,其声明与作用域之间通过: 分隔。由于禁用的原因,下面所有Matlab代码均通过Octave完成。
下面对for 和if 进行对比:
%此为octave代码,貌似CSDN不支持matlab高亮。。。这里用的还是python的高亮
x = rand(10,1);
for i = 1:10
if x(i)<0.3
fprintf("%f<0.3\n",x(i));
else if x(i)>0.6
fprintf("%f>0.6\n",x(i));
else
printf("%f\n",x(i));
end %匹配else if中的if
end
end
% 下面为其输出
0.077700<0.3
0.203065<0.3
0.578026
0.752277>0.6
0.380363
0.541303
0.520777
0.031512<0.3
0.042714<0.3
0.986611>0.6
>>
import numpy as np
x = np.random.rand(10)
for i in range(10):
if x[i]< 0.3: print(x[i],"<0.3")
elif x[i]>0.6: print(x[i],">0.6")
else: print(x[i])
0.13810550482646344 <0.3
0.05145857194203651 <0.3
0.40510564390649306
0.01924290850447119 <0.3
0.3126615170549344
0.9716907139903828 >0.6
0.3306312812282888
0.08156490331007271 <0.3
0.24120991717365392 <0.3
0.7177679530429059 >0.6
>>>
while 也是一样的道理,break 和continue 也基本是相同的。
switch
Matlab中可以使用switch...case ,python中没有这个语法,可以通过字典代替。
x = [1,2,3,3,2,1];
for i = 1:6
switch x(i)
case 1
disp('one')
case 2
disp('two')
otherwise
disp('three')
end
end
% 下面位计算结果
one
two
three
three
two
one
在python中可以这样写:
dic = {1:"one",2:"two",3:"three"}
for i in x:
print(dic[i])
one
two
three
three
two
one
函数
Matlab和Python的函数标识符分别为function 和def ,接下来写一个阶乘
% 此为octave代码
function y = fac(x)
if x>1
y = x*fac(x-1);
else
y = 1;
end
end
% 下面位调用结果
>> fac(5)
ans = 120
def fac(x):
return x*fac(x-1) if x > 1 else 1
>>> fac(5)
120
匿名函数
% matlab
>> sqr = @(x) x^2;
>> sqr(3)
ans = 9
>> (@(x) x^2)(5)
ans = 25
>>> sqr = lambda x:x**2
>>> sqr(3)
9
>>> (lambda x:x**2)(5)
25
>>> fac = lambda x : x*fac(x-1) if x > 1 else 1
>>> fac(5)
120
cell
Matlab中的cell相当于Python中的list。
>>> x = [1,'2',3,[4,5]]
>>> x
[1, '2', 3, [4, 5]]
类
Matlab中一个类就是一个文件,且文件名和类名相同,文件需要在当前的工作路径中
% 此为Person.m文件中定义的类
classdef Person
properties
Age = 18;
Gender = "girl";
Name = "Lily";
endproperties
methods %类方法,静态方法需要加Static
function setName(obj,string)
obj.Name = string;
endfunction
function Intro(obj)
fprintf("I'm %s\n",obj.Name);
endfunction
endmethods
endclassdef
python中可以在命令行中创建类,也可以在文件中创建类,如果在文件中创建了一个类,需要通过import 进行导入,才能在命令行中调用。
>>> class Person:
... Age = 18
... Gender = "girl"
... Name = "Lily"
... def setName(self, str):
... self.Name = str
... def Intro(self):
... print("I'm",self.Name)
...
>>> p = Person()
>>> p.setName("wang")
>>> p.Intro()
I'm wang
矩阵创建和索引
python的numpy 包封装了大量数值计算功能,可以完美替代Matlab,下面的python代码中默认from numpy import *
下面的对比出numpy中文网:与 Matlab 比较
Matlab | Python | 简略说明 |
---|
[1 2 3; 4 5 6] | array([[1.,2.,3.], [4.,5.,6.]]) | 2x3矩阵 | zeros(5,1) | zeros([5,1]) | 5×1零向量 | ones(5) | ones([5,5]) | 5×5全1矩阵 | eye(3) | eye(3) | 3x3单位矩阵 | rand(3,4) | random.rand(3,4) | 3x4随机矩阵 | 1:5:20 | arange(1,20,5) | [ 1, 6, 11, 16] | [A,A] | hstack([A,B]) | 横向拼接 | [A;A] | vstack([a,b]) | 纵向拼接 | A(end) | A[-1] | 最后一个元素 | A(2,5) | A[1,4] | 返回第二行,第五列中的元素 | A(2,:) | A[1] 或A[1,:] | 第二行 | a(1:5,:) | A[0:5] ,A[:5] 或A[0:5,:] | 前五行 | A(end-4:end,:) | A[-5:] | 最后五行 | A(1:3,5:9) | A[0:3][:,4:9] | 1至3行与5至9列交叉的子矩阵 | A([2,4,5],[1,3]) | A[ix_([1,3,4],[0,2])] | 第2,4,5行与第1,3列交叉的元素 | A(3:2:21,:) | A[2:21:2,:] | 第3行至第21行之间隔2行取1行 | A(1:2:end,:) | A[ ::2,:] | 返回a的奇数行 | A(end: -1:1,:) | A[ ::-1,:] | 行序转置 |
矩阵计算和操作
在Matlab中,元素之间的乘除法需要通过. 来实现,Python则完全不需要。
Matlab | Python | 简略说明 |
---|
A.' | A.T | 矩阵转置 | A' | A.conj().T | 共轭转置 | A * B | A @ B | 矩阵乘法 | A .* B | a * b | 元素乘法 | A./B | A/B | 元素除法 | A.^3 | A**3 | A的3次方 | (A>0.5) | (A>0.5) | A中元素大于0.5的为True,否则为False | find(A>0.5) | nonzero(A>0.5) | A中所有大于0.5的元素的位置 | A(A>0.5) | A[A>0.5] | 返回A中大于0.5的元素 | A(A<0.5)=0 | A[A<0.5]=0 | 将A中小于0.5的元素置零 | A(:)=3 | A[:]=3 | 将所有值设为3 | max(max(A)) | A.max() | A的最大元素 | max(A) | A.max(0) | 每列矩阵的最大元素(第0个坐标轴方向取最大值) | max(A,[],2) | A.max(1) | 每行矩阵最大元素 | max(A,B) | maximum(A, B) | 逐个比较A、B元素,返回每对中的最大值 | norm(A) | sqrt(A @ A) 或linalg.norm(v) | 2范数 | inv(A) | linalg.inv(A) | 方阵的逆 | pinv(A) | linalg.pinv(A) | 矩阵的伪逆 | rank(A) | linalg.matrix_rank(A) | 矩阵的秩 | A\b | linalg.solve(A,b) (A为方阵)
blinalg.lstsq(A,b) (A不必为方阵) | Ax = b的解x | fft(A) | fft(A) | 傅立叶变换 | ifft(A) | ifft(A) | 逆傅立叶变换 | sort(A) | A.sort() | 排序 |
|