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

2021-02-05 10:04:40 浏览数 (1)

参考链接: C 程序使用多维数组将两个矩阵相乘

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

  简述

  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上的实现方式

  矩阵赋值

  创建矩阵

  -Python_np,array

  import numpy 

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

  import numpy 

  -Matlab

  A=[ 1 2 3 ; 4 5 6 ; 7 8 9 ]

  矩阵元素检索

  如何读取矩阵中某行某列的数值,如在以上矩阵中我们要识别第二行,第三列的数值-PythonPython的序列中各元素被视为第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 

  输出结果分别如下

  1 

  所以在针对一维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服务,本团队具备规范化的服务流程与一对一的专业人员配置,保障高质高效服务用户需求。

    图注:代码家园淘宝店

0 人点赞