在算法第四版书中,第一章的第一节基础编程模型后的提高题的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
而|m| =
如向量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
有很多不足奥,快提快提,一起学习 呀吼~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)