软硬件环境
- ubuntu 18.04 64bit
- numpy 1.19.2
- opencv 4.4.0
简介
矩阵的常用运算包括: 加法、减法、点乘、点除和乘法等。
加法运算
矩阵的加法就是2个矩阵对应位置的数值相加。
In [1]: import numpy as np
In [2]: m1 = np.array([[1, 2, 3], [4, 5, 6]] ,np.uint8)
In [3]: m2 = np.array([[4, 5, 6], [7, 8, 9]] ,np.uint8)
In [4]: s = m1 + m2
In [5]: s
Out[5]:
array([[ 5, 7, 9],
[11, 13, 15]], dtype=uint8)
In [6]:
上例中数据类型都是 unit8
,如果2个矩阵数据类型不同,如 uint8
和 float32
,这时候经过加法运算后的数据类型就是 float32
了,取数值范围更大的类型
在 opencv
中,同样可以进行矩阵的加法运算
In [7]: import cv2
In [8]: cv2.add(m1, m2, dtype=cv2.CV_32F)
Out[8]:
array([[ 5., 7., 9.],
[11., 13., 15.]], dtype=float32)
减法运算
矩阵的减法和矩阵加法类似
In [9]: s2 = m2 - m1
In [10]: s2
Out[10]:
array([[3, 3, 3],
[3, 3, 3]], dtype=uint8)
再来看看下面的示例,
In [11]: s3 = m1 - m2
In [12]: s3
Out[12]:
array([[253, 253, 253],
[253, 253, 253]], dtype=uint8)
来看 uint8
的情况,第一行第一列的结果,1 – 4 = -3,然后针对255取模,-3 % 255 + 1 = 253
矩阵点乘
矩阵的点乘即2个矩阵对应位置的数值相乘。矩阵点乘可以使用*
运算符或者 np.multiply
In [14]: s4 = m1 * m2
In [15]: s4
Out[15]:
array([[ 4, 10, 18],
[28, 40, 54]], dtype=uint8)
In [16]: np.multiply(m1, m2)
Out[16]:
array([[ 4, 10, 18],
[28, 40, 54]], dtype=uint8)
矩阵点除
矩阵点除和点乘运算类似,对应位置的数值相除
In [17]: s5 = m2 / m1
In [18]: s5
Out[18]:
array([[4. , 2.5 , 2. ],
[1.75, 1.6 , 1.5 ]])
矩阵乘法
可以使用 numpy.dot
方法实现矩阵的乘法,要求第一个矩阵的列和第二个矩阵的行一致
In [20]: m3 = np.array([[1, 2], [3, 4], [5, 6]], np.uint8)
In [21]: np.dot(m1, m3)
Out[21]:
array([[22, 28],
[49, 64]], dtype=uint8)