说明:python中numpy包本身是已经提供了计算行列的方法,但是运算的时候发现会有差异,比如行列式有一个特性,行列式本身和转置后的行列式结果是相同的,但是使用numpy包计算后发现结果并不一样。所以会想着需要重新写一下

在这里,使用的是行列式展开式的方式进行计算的,即把行列式按照展开公式展开然后进行计算

解决方案如下:

一、生成行列式的全排列

二、计算每一种排列的逆

三、n*n行列式展开并求乘积

四、求和

代码如下:

def arrange(x,y,s):
    if s > 1:
        global temp_list
        temp_list = [i+j for i in x for j in y]
        return arrange(temp_list,y,s-1),temp_list
    else:
        return temp_list
def calculate_det(x):
    x = [str(i) for i in range(len(y))]
    a,result = arrange(x,x,len(y))
    results = [list(i) for i in result if len(set(list(i))) == len(y)]
    # 计算逆的值
    inverse_value = []
    for i in range(len(results)):
        s = 0
        for j in range(len(results[i])):
            for k in range(j+1,len(results[i])):
                if results[i][j] > results[i][k]:
                    s += 1
        inverse_value.append(s)
    inverse_cofficient = [1 if i % 2 == 0 else -1 for i in inverse_value]
#     将行列式按照公式展开即可
    range_list = []
    for i1 in range(len(results)):
        temp_list = [str(y[i2][int(i3)]) for i2,i3 in zip(range(len(y)),results[i1])]
        range_list.append(eval('*'.join(temp_list))*inverse_cofficient[i1])
    return sum(range_list)


if __name__ == '__main__':
    y = np.array([[3,2,6,8],[2,8,1,2],[3,4,1,5],[9,2,1,7]])
    result = calculate_det(y)
    print(result)

写在后面的话,行列式计算,有多种方式,如果是手算的话,目前更多用的是下三角或上三角法,即通过线性变换,让行列式变成下三角形的结果,然后对解线进行乘积即可。而在这里,因为是计算机计算,所以采用了行列式展开式的方式进行的计算,当然,使用下三角方法用计算机也是可以实现的,这两种方法其实是两种解决方案的思想。一种是把原始数据当成一个字符串对象,然后不停的从其中取数进行构造。使得通过构造的方式将现有对象变换成想要的结果。另一种思想是把原始数据对象当做一个完整的对象,所有的变换通过和别的对象进行运算,然后生成满足对象的结果。

核心思想:在算法中,进行常规的数据变换,或者格式变换,许多时候,我们会选择对索引位置进行重新排列,或者按照一定的算法进行重新排列处理,但是我们可以确定的一点是,我们的变换也可以通过运算的方式进行数据变换,让运算的结果满足我们的要求,而不是把对象当做字符串对象来处理。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐