注释方案: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
>>
#此为python代码
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])
# 下面为python的输出
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
也基本是相同的。
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
# 此为python代码
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
Matlab中的cell相当于Python中的list。
# 此为python代码
>>> 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() |
排序 |