技术图文:Matlab VS. Numpy 常见矩阵
背景
前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。
这是第 4 篇,对比 Matlab 与 Numpy 中经常用到的各种矩阵,比如零矩阵、单位矩阵、全1矩阵、对角矩阵、均匀分布的随机矩阵、标准正态分布的随机矩阵等。
虽然 Numpy 定义了 matrix
类型,使用该 matrix
类型创建的是矩阵对象。但是由于 NumPy 中同时存在 ndarray
和 matrix
对象,因此用户很容易将两者弄混。这有违 Python 的“显式优于隐式”的原则,因此官方并不推荐在程序中使用 matrix
。在这里,我们仍然用 ndarray
来介绍。
1. 零矩阵
零矩阵为矩阵内所有元素为零的矩阵。在具体任务中通常先用零矩阵来确定大小,随后为矩阵元素赋值。
在 Matlab和Python 中都用zeros()
函数来实现。
在 Matlab 中,zeros(m,n)
表示零矩阵,其中mmm为行数,nnn为列数。若为方阵,则以zeros(n)
表示。
在 Numpy 中,numpy.zeros(shape, dtype=None, order='C')
函数返回给定形状和类型的零数组。
【例1】求3行4列的零矩阵。
Matlab:
>> A = zeros(3,4);
>> disp(A)0 0 0 00 0 0 00 0 0 0
Python:
import numpy as npA = np.zeros([3, 4])
print(A)
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
【例2】求4阶的零矩阵。
Matlab:
>> A = zeros(4);
>> disp(A)0 0 0 00 0 0 00 0 0 00 0 0 0
Python:
import numpy as npA = np.zeros([4, 4])
print(A)
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]A = np.zeros(4)
print(A)
# [0. 0. 0. 0.]
np.zeros(4)
表示生成 Numpy 中的包含4个零元素的一维数组。
注意:在线性代数里面讲的维数和数组的维数不同,如线代中提到的 n 维行向量在 Numpy 中是一维数组,而线性代数中的 n 维列向量在 Numpy 中是一个shape为(n, 1)的二维数组。
2. 全1矩阵
矩阵中所有元素为1,称为全1矩阵。
在 Matlab和Numpy 中都用ones()
函数来表示。
在 Matlab 中,ones(m,n)
表示全1矩阵,其中mmm为行数,nnn为列数。若为方阵,则以ones(n)
表示。
在 Numpy 中,numpy.ones(shape, dtype=None, order='C')
函数返回给定形状和类型的全1数组。
【例1】求4阶全1矩阵。
Matlab:
>> A=ones(4);
>> disp(A)1 1 1 11 1 1 11 1 1 11 1 1 1
Python:
import numpy as npA = np.ones([4, 4])
print(A)
# [[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]A = np.ones(4)
print(A)
# [1. 1. 1. 1.]
【例2】求3行4列的全1矩阵。
Matlab:
>> A=ones(3,4);
>> disp(A)1 1 1 11 1 1 11 1 1 1
Python:
import numpy as npA = np.ones([3, 4])
print(A)
# [[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]
3. 单位矩阵
单位矩阵为主对角线元素全为1,而其它元素全为零的矩阵,数学上以III或EEE表示之。
在 Matlab和Numpy 中都用eye()
函数来表示,而 Numpy 中还提供了identity()
函数来专门生成方阵。
在 Matlab 中,eye(m,n)
表示单位矩阵,其中mmm为行数,nnn为列数,若为方阵,则以eye(n)
表示。
在 Numpy 中,numpy.eye(N, M=None, k=0, dtype=float, order='C')
函数返回一个对角线上为1,其它地方为零的单位数组。numpy.identity(n, dtype=None)
函数则返回一个方的单位数组。
【例1】求4行4列的单位矩阵。
Matlab:
>> I=eye(4);
>> disp(I)1 0 0 00 1 0 00 0 1 00 0 0 1
Python:
import numpy as npI = np.eye(4)
print(I)
# [[1. 0. 0. 0.]
# [0. 1. 0. 0.]
# [0. 0. 1. 0.]
# [0. 0. 0. 1.]]A = np.identity(4)
print(A)
# [[1. 0. 0. 0.]
# [0. 1. 0. 0.]
# [0. 0. 1. 0.]
# [0. 0. 0. 1.]]
【例2】求3行4列的单位矩阵。
Matlab:
>> I=eye(3,4);
>> disp(I)1 0 0 00 1 0 00 0 1 0
Python:
import numpy as npI = np.eye(3, 4)
print(I)
# [[1. 0. 0. 0.]
# [0. 1. 0. 0.]
# [0. 0. 1. 0.]]
4. 对角矩阵
在 Matlab和Numpy 中都用diag()
函数来表示,并且含义相同。
若书写格式为X=diag(v,k)
。将向量vvv写入矩阵XXX的主对角线上,而矩阵XXX的其它元素为零。kkk表示上移或下移行数,正表示上移,负表示下移,k=0k=0k=0则恰好在主对角线上,当k=0k=0k=0时可以默认不写。
另一种书写格式为v=diag(X,k)
。它是从矩阵XXX中提取对角线元素到向量vvv上。k=0k=0k=0或默认,则提取主对角线元素,否则提取上移kkk行或下移kkk行的对角线元素,正号表示上移,负号表示下移。
【例1】已知行向量v=(1 2 3 4)
,将vvv向量元素写入矩阵的主对角线,求对角矩阵,以及上移一行的对角矩阵和下移一行的对角矩阵。
Matlab:
>> v=[1,2,3,4];
>> lambda = diag(v);
>> disp(lambda)1 0 0 00 2 0 00 0 3 00 0 0 4>> lambda = diag(v,1);
>> disp(lambda)0 1 0 0 00 0 2 0 00 0 0 3 00 0 0 0 40 0 0 0 0>> lambda = diag(v,-1);
>> disp(lambda)0 0 0 0 01 0 0 0 00 2 0 0 00 0 3 0 00 0 0 4 0
Python:
import numpy as npv = [1, 2, 3, 4]
lamb = np.diag(v)
# print(lamb)
# [[1 0 0 0]
# [0 2 0 0]
# [0 0 3 0]
# [0 0 0 4]]lamb = np.diag(v, k=1)
print(lamb)
# [[0 1 0 0 0]
# [0 0 2 0 0]
# [0 0 0 3 0]
# [0 0 0 0 4]lamb = np.diag(v, k=-1)
print(lamb)
# [[0 0 0 0 0]
# [1 0 0 0 0]
# [0 2 0 0 0]
# [0 0 3 0 0]
# [0 0 0 4 0]]
【例2】
已知u=(2 3 5 8 11)
,创建Vandermonde矩阵XXX,提取XXX的主对角线赋予向量vvv,主对角线上移一行赋予向量v1v1v1,下移一行赋予向量v2v2v2。
>> u=[2,3,5,8,11];
>> X=vander(u);
>> disp(X)16 8 4 2 181 27 9 3 1625 125 25 5 14096 512 64 8 114641 1331 121 11 1>> v=diag(X);
>> disp(v)16272581>> v1=diag(X,1)';
>> disp(v1)8 9 5 1>> v2=diag(X,-1)';
>> disp(v2)81 125 64 11
Python:
import numpy as npdef vander(u):n = len(u)a = np.ones([n, n], dtype=np.int)for i in range(n - 2, -1, -1):a[:, i] = u ** (n - i - 1)return au = np.array([2, 3, 5, 8, 11])
X = vander(u)
print(X)
# [[ 16 8 4 2 1]
# [ 81 27 9 3 1]
# [ 625 125 25 5 1]
# [ 4096 512 64 8 1]
# [14641 1331 121 11 1]]v = np.diag(X)
print(v)
# [16 27 25 8 1]v1 = np.diag(X, k=1)
print(v1)
# [8 9 5 1]v2 = np.diag(X, k=-1)
print(v2)
# [ 81 125 64 11]
5. 均匀分布的随机矩阵
在 Matlab和Numpy 中都可以生成均匀分布的随机矩阵。
在 Matlab 中,有rand()
,rands()
,randi()
三种方式:
rand(n)
得到一个n×nn \times nn×n的矩阵。rands(n)
得到一个n×1n \times 1n×1的列向量。rand(m,n)
得到一个由均匀分布在(0,1)区间内元素组成的m×nm \times nm×n的矩阵。rands(m,n)
得到一个由均匀分布在(-1,1)区间内元素组成的m×nm \times nm×n的矩阵。randi(iMax,n)
是一个由均匀分布在[1,iMax]
区间内整型元素组成的n×nn \times nn×n的矩阵。randi(iMax,m,n)
是一个由均匀分布在[1,iMax]
区间内整型元素组成的m×nm \times nm×n的矩阵。randi([iMin,iMax],m,n)
是一个由均匀分布在[iMin,iMax]
区间内整型元素组成的m×nm \times nm×n矩阵。
在 Numpy 中,有uniform()
,rand()
,randint()
三种方式:
numpy.random.uniform(low=0.0, high=1.0, size=None)
从均匀分布中抽取样本,区间为[low, high)
。numpy.random.rand()
作为uniform(d0, d1, ..., dn)
的特列,可以得到[0,1)
之间的均匀分布的随机数。numpy.random.randint(low, high=None, size=None, dtype='l')
作为uniform
的另一特例,可以得到[low,high)
之间均匀分布的随机整数,如果high=None
,那么区间为[0,low)
。
【例1】求两个4阶在(0,1)范围内的均匀分布的随机矩阵,两个4阶在[1,100]范围内的整型均匀分布的随机数,两个4×1的在(-1,1)范围内的列向量,分别赋值给A1,A2。
Matlab:
>> A1=rand(4);
>> A2=rand(4);
>> disp(A1)0.2232 0.6585 0.3061 0.94720.8876 0.8102 0.2829 0.67460.7311 0.2015 0.4056 0.70160.3146 0.1130 0.8241 0.6380>> disp(A2)0.2420 0.6504 0.2952 0.63280.9741 0.0814 0.3742 0.21570.8539 0.8477 0.7121 0.41150.7950 0.1764 0.6574 0.4196>> A1 = randi(100,4);
>> A2 = randi(100,4);
>> disp(A1)47 56 32 6165 25 94 9383 5 19 9225 76 55 4>> disp(A2)69 86 47 414 84 98 351 80 59 930 81 73 59>> A1=rands(4);
>> A2=rands(4);
>> disp(A1)0.27960.40790.5119-0.9015>> disp(A2)0.7674-0.40590.3743-0.3374
Python:
import numpy as npA1 = np.random.rand(4, 4)
A2 = np.random.rand(4, 4)
print(A1)
# [[0.26928205 0.36481389 0.66676956 0.86820657]
# [0.91229641 0.04239373 0.88579269 0.41331319]
# [0.45072909 0.16651979 0.09096757 0.63638447]
# [0.96256553 0.12203043 0.88213325 0.70119275]]print(A2)
# [[0.99001364 0.59498628 0.18862191 0.24256341]
# [0.1211043 0.32129381 0.9460552 0.05122717]
# [0.63987355 0.61879931 0.31145657 0.32688994]
# [0.73492717 0.43796817 0.9866393 0.93774641]]A1 = np.random.randint(1, 100, [4, 4])
A2 = np.random.randint(1, 100, [4, 4])
print(A1)
# [[ 9 44 72 10]
# [33 89 55 47]
# [77 59 84 83]
# [43 23 86 59]]print(A2)
# [[ 5 89 33 11]
# [21 95 73 92]
# [ 2 55 30 25]
# [54 40 65 83]]A1 = np.random.uniform(-1, 1, 4)
A2 = np.random.uniform(-1, 1, 4)
print(A1.reshape(4, 1))
# [[ 0.93055573]
# # [-0.86806273]
# # [-0.8755103 ]
# # [ 0.54197419]]print(A2.reshape(4, 1))
# [[-0.32703134]
# [ 0.80505337]
# [-0.83637509]
# [ 0.69088863]]
【例2】求三个3×43 \times 43×4阶均匀分布的随机矩阵,范围在(0,1),(-1,1)和[10,100],分别赋值给A1,A2,A3。
Matlab:
>> A1=rand(3,4);
>> disp(A1)0.7850 0.5495 0.0590 0.17400.0589 0.5529 0.1722 0.84260.3510 0.1447 0.4489 0.4642>> A2=rands(3,4);
>> disp(A2)-0.3603 -0.5592 0.2269 0.0017-0.4025 -0.7993 -0.8550 0.62550.2765 0.6801 0.4448 -0.2550>> A3 = randi([10,100],3,4);
>> disp(A3)59 66 63 8131 55 50 6315 88 98 34
Python:
import numpy as npA1 = np.random.rand(3, 4)
print(A1)
# [[0.39787012 0.13709285 0.43893989 0.96172473]
# [0.43530643 0.05443109 0.36316048 0.94816304]
# [0.55265213 0.60320904 0.24952952 0.83926361]]A2 = np.random.uniform(-1, 1, [3, 4])
print(A2)
# [[ 0.32297696 -0.78124371 -0.39123924 0.24991417]
# [ 0.85884802 -0.23765347 0.56611597 0.90097203]
# [-0.72628246 -0.10791575 -0.11244534 0.40308801]]A3 = np.random.randint(10, 100, [3, 4])
print(A3)
# [[29 53 65 89]
# [10 77 44 33]
# [28 85 35 42]]
【例3】使用种子使得每次随机数相同。
Matlab:
>> s=rng(20200821); % 保存随机数seed
>> disp(s)Type: 'twister'Seed: 20200821State: [625×1 uint32]>> rng(s) % 调用随机数seed
>> A1=rand(4);
>> disp(A1)0.0172 0.6571 0.8932 0.31100.6420 0.8373 0.8906 0.38150.0978 0.8899 0.6041 0.88750.4353 0.7270 0.5803 0.3294>> rng(s)
>> A2=rand(4);
>> disp(A2)0.0172 0.6571 0.8932 0.31100.6420 0.8373 0.8906 0.38150.0978 0.8899 0.6041 0.88750.4353 0.7270 0.5803 0.3294
Python:
import numpy as npnp.random.seed(20200821)
A1 = np.random.rand(4, 4)
print(A1)
# [[0.32452405 0.49496274 0.88643592 0.75054701]
# [0.88940824 0.4339118 0.45194462 0.80973677]
# [0.39462383 0.72057367 0.21335562 0.87752275]
# [0.42963472 0.92526431 0.22639798 0.83541325]]np.random.seed(20200821)
A2 = np.random.rand(4, 4)
print(A2)
# [[0.32452405 0.49496274 0.88643592 0.75054701]
# [0.88940824 0.4339118 0.45194462 0.80973677]
# [0.39462383 0.72057367 0.21335562 0.87752275]
# [0.42963472 0.92526431 0.22639798 0.83541325]]
6. 正态分布的随机矩阵
在 Matlab和Numpy 中都用randn()
函数来表示抽取标准正态分布的样本。
注:既然是随机数,无论产生多少个,都只能算是样本,所谓期望,是对样本数量足够多的情况而言的。一般而言,样本数量越大,其均值越接近0,但并不是说就一定为0。
【例1】列出4阶正态分布的随机矩阵。
Matlab:
randn(m,n)
产生一个期望为0,标准差为1且服从正态分布的随机矩阵,其中mmm为行数,nnn为列数,若为方阵,则以randn(n)
表示。
>> A = randn(4);
>> disp(A)0.5611 -0.6045 -0.0025 -1.1567-1.1985 -0.1034 0.1916 0.6170-1.0359 1.1587 -0.4981 0.0227-0.5967 -1.8604 0.9566 0.8366>> A=randn(100000,1);
>> histogram(A)
Python:
numpy.random.randn(d0, d1, ..., dn)
从均值为0,标准差为1的标准正态分布中抽取样本。
import numpy as np
import matplotlib.pyplot as pltA = np.random.randn(4, 4)
print(A)
# [[-1.6652191 2.57166227 -2.12784124 1.52365121]
# [-1.03609184 -0.32386994 0.45424631 0.58238759]
# [-0.02458478 -1.69242129 0.01512539 0.8165994 ]
# [-0.39558196 -1.62699892 -0.5198507 2.29518816]]A = np.random.randn(100000, 1)
plt.hist(A, bins=20)
plt.show()
总结
以上总结的不一定全,但先有个框架等后面在实践的过程中慢慢补充。今天就到这里吧。See You!
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
技术图文:Matlab VS. Numpy 常见矩阵相关推荐
- 技术图文:Matlab VS. Numpy 矩阵基本运算
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系. ...
- python矩阵左除_技术图文:Matlab VS. Numpy 矩阵基本运算
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 3 篇,对比 Matlab 与 Numpy 在矩阵基本运算方面的区别与联系. ...
- Matlab — 常见矩阵生成及矩阵运算
常见矩阵生成及矩阵运算 一. 常用矩阵生成 1. 零矩阵 2. 单位矩阵 3. 全1矩阵 4. 幻方矩阵 5. 随机整数排列 6. 生成拓托普利兹矩阵 7. 生成对角矩阵 8. 生成0-1均匀分布矩阵 ...
- matlab矩阵正交变换,在线计算专题(12):矩阵的特征值、特征向量、正交变换与二次型与常见矩阵分解...
1.计算特征多项式 例 计算以下矩阵的特征多项式 参考输入表达式为characteristic polynomial {{-1,1,0},{-4,3,0},{1,0,2}} 执行计算得到的结果如下. ...
- python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵
原标题:Python使用numpy计算矩阵特征值.特征向量与逆矩阵 Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv() ...
- Python使用numpy计算矩阵特征值、特征向量与逆矩阵
Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv()函数用来计算可逆矩阵的逆矩阵. >>> impor ...
- matlab 创建同型矩阵_仅在第1部分之间的海洋中探索同型图
matlab 创建同型矩阵 同型的教训-第1部分 (Lessons of Isotype - PART 1) There's much to be told in the story of the I ...
- matlab 创建同型矩阵_探索同型图我们的私人生活第2部分
matlab 创建同型矩阵 同型的教训–第2部分 (Lessons of Isotype - PART 2) There's much to be told in the story of the I ...
- Matlab与数据结构 -- 对矩阵的排序
本图文介绍了Matlab怎样实现对矩阵的排序.
最新文章
- 希尔排序法对一维数组排序
- tinyumbrella java_tinyumbrella(小雨伞)
- 滴滴宋世君:DS(数据分析师),究竟是做什么的?
- matlab 求复数的模长,matlab计算带有复数的函数,最后求复数函数的模,结果里面却有...
- [AngularJS] Reusable directive, require from parent controller
- python 数据清洗 豆瓣电影_Python高阶操作--关于数据清洗
- 为何python不好找工作-学完Python,为什么还找不到工作?现实很残酷!
- 强名称(3)强名称的脆弱性
- 倒车雷达c语言编程,基于单片机的倒车雷达设计
- Vue3使用Echarts图表
- 网页设计常用字体(转)
- 深圳禾正医院自控系统案例|能迪科技canlead中央空调净化系统
- Delphi时间戳Unix转换DateTimeToUnix和UnixToDateTime
- 软件项目管理 1.3.敏捷项目管理概念
- 计算机图像识别的原理、过程、应用前景
- MSVCRTD.lib重复定义问题
- 3D打印机基础知识入门之硬件知识
- 文件包含漏洞(原理及介绍)
- LA-3713-TwoSAT
- 大魔王程序员生成记#06.1#C语言习题
热门文章
- php字符串转换表达式,php处理字符串格式的计算表达式
- 零基础学Java程序有什么好的建议
- Vue+Element-ui+二级联动封装组件
- spring-redis-data的一个坑
- PHP获取时间排除周六、周日的两个方法
- 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
- ASP.NET将Session保存到数据库中
- php_mongo.dll下载(php操作mongoDB需要)
- flash绘图API:恋上你的CD
- canvas上的像素操作(图像复制,细调)