说明: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)
写在后面的话,行列式计算,有多种方式,如果是手算的话,目前更多用的是下三角或上三角法,即通过线性变换,让行列式变成下三角形的结果,然后对解线进行乘积即可。而在这里,因为是计算机计算,所以采用了行列式展开式的方式进行的计算,当然,使用下三角方法用计算机也是可以实现的,这两种方法其实是两种解决方案的思想。一种是把原始数据当成一个字符串对象,然后不停的从其中取数进行构造。使得通过构造的方式将现有对象变换成想要的结果。另一种思想是把原始数据对象当做一个完整的对象,所有的变换通过和别的对象进行运算,然后生成满足对象的结果。
核心思想:在算法中,进行常规的数据变换,或者格式变换,许多时候,我们会选择对索引位置进行重新排列,或者按照一定的算法进行重新排列处理,但是我们可以确定的一点是,我们的变换也可以通过运算的方式进行数据变换,让运算的结果满足我们的要求,而不是把对象当做字符串对象来处理。