栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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.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 比较

MatlabPython简略说明
[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:20arange(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则完全不需要。

MatlabPython简略说明
A.'A.T矩阵转置
A'A.conj().T共轭转置
A * BA @ B矩阵乘法
A .* Ba * b元素乘法
A./BA/B元素除法
A.^3A**3A的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)=0A[A<0.5]=0将A中小于0.5的元素置零
A(:)=3A[:]=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)矩阵的秩
Ablinalg.solve(A,b)(A为方阵)
blinalg.lstsq(A,b)(A不必为方阵)
Ax = b的解x
fft(A)fft(A)傅立叶变换
ifft(A)ifft(A)逆傅立叶变换
sort(A)A.sort()排序
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号