在算法第四版书中,第一章的第一节基础编程模型后的提高题的1.1.33,题目要求编写一个Matrix库,完成一些运算,我们可以使用任何语言编写
在书中的的代码实现语言为java,我们这里使用python语言编写,这样做的缺陷是:
python中函数名不可以重复,但是Java可以。Java可以通过方法传入的实际参数判断到底使用哪个方法,因此Java可以编写同名方法。
在这篇文章中mult函数的作用类似,但是名字又不能一样,所以我给它们后面加了数字以示区分
向量之间的点乘为数,叉乘为向量。我们在此文章只演示点乘
叉乘的计算方法在此视频有讲解:【鲲哥】《基础两千题》 11.16节 法向量的叉乘求法_哔哩哔哩_bilibili
假设两个向量 m(a,b,c); n(x,y,z)
它们的点乘公式为 m·n = |m|·|n|·cosθ = a·x + b·y + c·z
如向量a(1,2,3); b(5,6,7) 的点乘结果为 a·b = 1*5+2*6+3*7 = 38。
def dot(x, y):
# 向量之间的点乘,向量也有叉乘 这里我们计算点乘,点乘结果为数,叉乘结果为向量
c = []
for i in range(len(x)):
c.append(x[i] * y[i])
return c
转置是一种变换,行列交换。如A矩阵为五行三列,转置后的矩阵C为三行五列。
就是矩阵A的第一行变为C的第一列,A的第二行为C的第二列.......
def transpose(a):
# 矩阵的转置
c = []
a_line, a_column = len(a), len(a[1]) # 获取矩阵的行数列数
for i in range(a_column):
n = []
for j in range(a_line):
n.insert(j, a[j][i])
c.insert(i, n)
return c
'''
此文章函数中所指矩阵都是如下形式
矩阵A为三行四列 它的样式就是 A = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]。
我们换个方式写就是这样
A = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
'''
假设两个矩阵A,B,当且仅当矩阵A的列数等于矩阵B的行数时,A,B可以相乘。
我们通过A(5,3); B(3,4) 这种方法表示矩阵的形状,意为A矩阵为五行三列,B三行四列。
AB矩阵相乘,行列相乘,左出行右出列。
A矩阵第一行的每个元素乘B矩阵第一列的每一个元素 的积相加为新矩阵C第一行第一列的值
所以只有A的列数等于B的行数才可以相乘
A矩阵第一行的每个元素乘B矩阵第二列的每一个元素 的积相加为新矩阵C第一行第二列的值
A矩阵第一行的每个元素乘B矩阵第三列的每一个元素 的积相加为新矩阵C第一行第三列的值
A矩阵第一行的每个元素乘B矩阵第四列的每一个元素 的积相加为新矩阵C第一行第四列的值
至此新矩阵C的第一行结果得出!!!
由于矩阵相乘是行列相乘,索引有点困难。
我们可以将它们转换为行行相乘,就是A矩阵乘B矩阵的转置,这样就变换为行行相乘,代码好写多了
def mult(a, b):
# 矩阵和矩阵之积: 当矩阵A的列数等于B的行数,AB可以相乘 矩阵A,B相乘相当于 矩阵A乘B的转置矩阵,行列相乘转换为行行相乘
b = transpose(b)
a_line, a_column = len(a), len(a[1])
b_line, b_column = len(b), len(b[1])
c = []
if a_column == b_column:
for i in range(a_line):
n = []
for j in range(b_line):
m = 0
for l in range(b_column):
m += a[i][l] * b[j][l]
n.append(m)
c.append(n)
return c
else:
return -1
因为矩阵的乘法前提是 列数等于行数,所以这里的向量为列向量。
如果是行向量那它的样式为一行多列,那么矩阵的列数就待要为1才可以相乘
这里的向量就是行向量了
def mult_2(y, a):
# 向量和矩阵之积,此函数下的向量指行向量 如a向量为一行三列[1,2,3] 这里的矩阵也是需要进行转置,将行列乘转为行行乘
a = transpose(a)
y_column = len(y)
a_line, a_column = len(a), len(a[1])
if y_column == a_line:
n = []
for j in range(a_line):
m = 0
for i in range(y_column): # 由于矩阵A列等于矩阵B行,所有y_column可以换为a_column
m += y[i] * a[j][i]
n.append(m)
return n
else:
return -1
有很多不足奥,快提快提,一起学习 呀吼~