我是靠谱客的博主 友好火车,最近开发中收集的这篇文章主要介绍写给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.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也是一样的道理,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 %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()排序

最后

以上就是友好火车为你收集整理的写给Matlab用户的Python急速入门手册的全部内容,希望文章能够帮你解决写给Matlab用户的Python急速入门手册所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部