矩阵,向量的积以及矩阵转置

在算法第四版书中,第一章的第一节基础编程模型后的提高题的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

有很多不足奥,快提快提,一起学习        呀吼~

你可能感兴趣的:(矩阵,线性代数,算法,python)