写给Matlab用户的Python急速入门手册

文章目录

    • 基本差异
    • 循环和判断
    • switch
    • 函数
    • cell
    • 矩阵创建和索引
    • 矩阵计算和操作

基本差异

注释方案:Matlab中用%,Python用#

Matlab的索引默认从1开始,通过();Python则从0开始。用[]

python中的字符串通过单引号或者双引号表示。

循环和判断

matlab通过end来终结一段代码,而python则通过缩进来表示作用域,其声明与作用域之间通过:分隔。由于禁用的原因,下面所有Matlab代码均通过Octave完成。

下面对forif进行对比:

%此为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也是一样的道理,breakcontinue也基本是相同的。

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的函数标识符分别为functiondef,接下来写一个阶乘

% 此为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 %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() 排序

你可能感兴趣的:(Python,matlab,python,开发语言,numpy)