c++矩阵类_Matlab与Python的矩阵运算

知乎专栏:[代码家园工作室分享]
收藏可了解更多的编程案例及实战经验。问题或建议,请留言;

简述

Matlab与NumPy/SciPy在功能实现上有很多相似之处。但在代码编译方面还有一些不同。NumPy与SciPy旨在基于Python下,通过最简单,自然的方式实现数学与科学计算,并非Matlab的简单复刻。本章我们从矩阵运算模块出发,对比Python与Matlab在实现矩阵创建与运算时的异同,以帮助习惯使用Matlab的用户快速熟悉并应用NumPy/SciPy库。

array还是matrix?哪个更好用?

NumPy提供了array与matrix两个类用于矩阵运算。array类可以用来处理各种n维数组的数学运算,而matrix类则是专用来进行二位矩阵运算的。这两种类只有以下几个微小的差异。用哪种类进行定义矩阵更好一些呢?

Numpy的开发者团队推荐我们使用array类进行矩阵运算,简要原因如下:

  • arrays是numpy库针对矢量/张量/矩阵定义的标准类。大多数Numpy返回的内容是array而非matrices类。

  • array类进行元素间智能运算的代码与进行线性代数运算有着明显区别。

  • Python 3.5以后NumPy支持使用 ‘@’ 符号进行矩阵点乘操作

  • 后续Numpy考虑删去np.matrix并将其统一到array类下。

matrix类矩阵运算的部分操作与matlab更相近,下面的对比演示中我们会展示matlab/array/matrix三者在矩阵定义及运算中的异同。

矩阵定义运算实例展示

我们来列举一些常用的矩阵运算操作,对比其在Python_np,array,Python_np.matrix,Matlab上的实现方式

矩阵赋值

创建矩阵

017a0c6d52eaa47f5464035774f9212f.png

-Python_np,array

import numpy 

-Python_np.matrix
matrix定义二维矩阵的方式有以下两种

import numpy 

-Matlab

A=[ 1 2 3 ; 4 5 6 ; 7 8 9 ]
矩阵元素检索

如何读取矩阵中某行某列的数值,如在以上矩阵中我们要识别第二行,第三列的数值
-Python
Python的序列中各元素被视为第0个,第1个,第2个……
接上段程序,此操作matrix类与array类并无区别。

1,

Matlab的序列中各元素被视为第1个,第2个,第3个……

a23=A(2,3)
矩阵点乘与元素智能相乘

元素智能相乘即矩阵中各素分别对应相乘
-Python_np.array

#矩阵点乘,适用于Python 3.5以上版本

-Python_np.martix

#矩阵点乘

-Matlab

B=A*A %矩阵点乘
B=A.*A %矩阵元素智能相乘
快捷操作

array可以使用.T快捷的实现矩阵转置,matrix可以使用.H,.I快捷的实现共轭转置矩阵及逆矩阵的求取。

-Python_np.array

#矩阵转置

-Python.np.matrix

#矩阵转置

-Matlab

AT=A.' %矩阵转置
ACT=A' %求共轭转置矩阵
AI=inv(A) %矩阵求逆
matrix与array的其他差异

-生成向量
Matrix只能生成二维数组,array可以生成任何维度的数组。需要注意的是array生成的1维数组在进行矩阵点乘时,会视其在乘号左侧或右侧转化为对应的1xN或Nx1的矩阵。matrix则无法自动转化。

此外由于在array中1xN数组为1维数组,其无法通过上述.T或np.transpose()操作转置成如Nx1矩阵(由于点乘时会自动变形,针对其的转置使用场景不多)。

import numpy 

输出结果分别如下

所以在针对一维array数组进行转置操作时应该参考如下代码:

import numpy 

matrix与array类的优劣总结

array

实现元素智能相乘更容易:A*B

x执行矩阵点积运算需要使用@:A@B

对于一维array数组,在执行矩阵点积运算时,一维数组会视需要自动调整成所需的1xN或Nx1的矩阵,非常方便。

array是NumPy的默认类,在程序编写中得到了最多的测试,使用第三方代码时输入输出也多为此类。

可以支持多维运算

语法表述与张量运算更接近

所有运算(+ , - , * , / 等)与智能元素运算均一致。

x与scipy.sparse共用时不太方便

matrix

矩阵赋值更接近于Matlab

x最多支持二维矩阵

x最小支持二位矩阵,无法定义向量,只能定义单行或单列矩阵。

x由于array是Numpy默认的类,部分第三方函数在输入matrix时也可能返回array类。

A*B进行点积更接近于线性代数的表达。

x进行智能元素相乘时相对复杂,需要写成multiply(A,B)代码.

x进行智能元素计算时逻辑有点混乱,”/”执行智能元素计算,而星号执行向量点积。

与scipy.sparse共用时代码相对简洁

商业推广

商业合作请进入淘宝店铺代码家园下单,硕博团队为大家提供涵盖深度学习,硬件开发,机械仿真,网页/应用开发等内容的定制化服务,新增Matlab代码转python服务,本团队具备规范化的服务流程与一对一的专业人员配置,保障高质高效服务用户需求。

6e5dbc24f573cba81a2f0467a7e7ea28.png

图注:代码家园淘宝店
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值