概述
文章目录
- 基本差异
- 循环和判断
- switch
- 函数
- cell
- 类
- 矩阵创建和索引
- 矩阵计算和操作
基本差异
注释方案: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.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
>>
#此为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中没有这个语法,可以通过字典代替。
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
cell
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 %sn",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) | 矩阵的秩 |
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用户的Python急速入门手册所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复