文章目录
- 基本差异
- 循环和判断
- switch
- 函数
- cell
- 类
- 矩阵创建和索引
- 矩阵计算和操作
基本差异
注释方案:Matlab中用%
,Python用#
。
Matlab的索引默认从1开始,通过()
;Python则从0开始。用[]
。
python中的字符串通过单引号或者双引号表示。
循环和判断
matlab通过end
来终结一段代码,而python则通过缩进来表示作用域,其声明与作用域之间通过:
分隔。由于禁用的原因,下面所有Matlab代码均通过Octave完成。
下面对for
和if
进行对比:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25%此为octave代码,貌似CSDN不支持matlab高亮。。。这里用的还是python的高亮 x = rand(10,1); for i = 1:10 if x(i)<0.3 fprintf("%f<0.3n",x(i)); else if x(i)>0.6 fprintf("%f>0.6n",x(i)); else printf("%fn",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 >>
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#此为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
也基本是相同的。
switch
Matlab中可以使用switch...case
,python中没有这个语法,可以通过字典代替。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19x = [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中可以这样写:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12dic = {1:"one",2:"two",3:"three"} #定义一个字典 for i in x: print(dic[i]) # 下面为其输出结果 one two three three two one
函数
Matlab和Python的函数标识符分别为function
和def
,接下来写一个阶乘
复制代码
1
2
3
4
5
6
7
8
9
10
11
12% 此为octave代码 function y = fac(x) if x>1 y = x*fac(x-1); else y = 1; end end % 下面位调用结果 >> fac(5) ans = 120
复制代码
1
2
3
4
5
6
7# 此为python代码 def fac(x): return x*fac(x-1) if x > 1 else 1 #下面为调用 >>> fac(5) 120
匿名函数的区别
复制代码
1
2
3
4
5
6
7% matlab >> sqr = @(x) x^2; >> sqr(3) ans = 9 >> (@(x) x^2)(5) ans = 25
复制代码
1
2
3
4
5
6
7
8
9>>> 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。
复制代码
1
2
3
4
5# 此为python代码 >>> x = [1,'2',3,[4,5]] >>> x [1, '2', 3, [4, 5]]
类
Matlab中一个类就是一个文件,且文件名和类名相同,文件需要在当前的工作路径中
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19% 此为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 %sn",obj.Name); endfunction endmethods endclassdef
python中可以在命令行中创建类,也可以在文件中创建类,如果在文件中创建了一个类,需要通过import
进行导入,才能在命令行中调用。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14>>> 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) | 矩阵的秩 |
Ab | 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() | 排序 |
最后
以上就是友好火车最近收集整理的关于写给Matlab用户的Python急速入门手册的全部内容,更多相关写给Matlab用户内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复