向量的点积
1506字,阅读需时6分钟
来自专栏
课程/专栏

先看一道小学数学题。

例1:商店出售A、B、C三种类型的铅笔,A型铅笔1.2元一支,B型铅笔1.8元一支,C型铅笔2.1元一支。小明买了A型铅笔10支,B型铅笔6支,C型铅笔5支,问小明买铅笔一共花了多少钱?

比较经典的解题方式:

1.2*10+1.8*6+2.1*5=33.3

下面我们尝试使用向量来解题,铅笔价格用向量A表示,铅笔数量用向量B表示。

A=(1.2,1.8,2.1)

B=(10,6,5)

A和B是三维向量,向量的这种表示方式称为行向量,向量分量书写在同一行上。向量也可以使用下面的方式来表示:

 001.png

向量的这种表示方式称为列向量,向量的分量书写在同一列上。

若将向量A的每个分量乘以向量B的对应分量,然后将所得之积相加,我们得到下面的算式:

1.2*10+1.8*6+2.1*5=33.2

这个算式正是我们求解例1的公式。向量的这种运算方式称为向量的点积。设在n维空间中有A、B两个向量:

02.png

则:

03.png

A*B称为向量A与B的点积。

例1程序清单

import numpy as np
# 定义向量A和B
A = np.array([1.2,1.8,2.1])
B = np.array([10,6,5])
# 计算向量A和B的点积
result = np.dot(A,B)
print("%.2f" % (result))

对n维空间中任意向量A,B,C和任意纯量c,有:

(a)A*B = B * A

(b)A*(B+C) = A*B + A*C

(c)c(A*B)=(cA)*B=A*(cB)

(d)A*A > 0,若A!=0

(e)A*A=0,若A=0

例2:彩色图像转灰度的计算

在图像编程中,经常需要对图像进行灰度操作。对于彩色图像转灰度,一个常用公式是:

Gray = R*0.299 + G*0.587 + B*0.114

若对图像的每个像素进行灰度转换,计算效率非常低。可以使用矩阵进行运算,矩阵是若干个列向量或行向量的组合。

04.png

矩阵M由3个行向量构成,每个行向量为3维向量,因此M矩阵为3*3矩阵,也称为3行3列矩阵。

矩阵M可以与向量A进行点积运算,运算结果是一个与向量A维度相同的新向量。运算规则是矩阵M的所有行向量,与向量A进行点积运算,运算结果做为新向量的元素。

05.png

其中,M*A表示M与A进行点积运算。矩阵M与向量A可以进行点积运算的条件是矩阵M列向量的维度等于向量A的维度。

图像数据是用数值表示的各像素颜色值的集合,颜色空间可以是RGB、CMYK等。在计算机图像处理程序中,通常用二维数组来存放图像数据,二维数组结构即为矩阵结构。矩阵的行数对应图像的高度,矩阵的列数对应图像的宽度,矩阵元素就是像素的颜色值。若需要将彩色图像转换为灰度图像,将像素的颜色值设置为灰度值即可。

例2程序清单

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
 
def rgb2gray(rgb):
    # 矩阵与向量的点积运算
    return np.dot(rgb, [0.299, 0.587, 0.114])
 
img = mpimg.imread('image.jpg')
# 图像数据灰度处理
gray = rgb2gray(img)
plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.show()
我要评论
全部评论