python中列表的*乘運算,使用python計算行列式
python中列表的*乘運算,使用python計算行列式
說明:python中numpy包本身是已經提供了計算行列的方法,但是運算的時候發現會有差異,比如行列式有一個特性,行列式本身和轉置后的行列式結果是相同的,但是使用numpy包計算后發現結果并不一樣。所以會想著需要重新寫一下
python中列表的*乘運算?在這里,使用的是行列式展開式的方式進行計算的,即把行列式按照展開公式展開然后進行計算
解決方案如下:
一、生成行列式的全排列
二、計算每一種排列的逆
三、n*n行列式展開并求乘積
四、求和
代碼如下:
def arrange(x,y,s):if s > 1:global temp_listtemp_list = [i+j for i in x for j in y]return arrange(temp_list,y,s-1),temp_listelse: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 = 0for j in range(len(results[i])):for k in range(j+1,len(results[i])):if results[i][j] > results[i][k]:s += 1inverse_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)
寫在后面的話,行列式計算,有多種方式,如果是手算的話,目前更多用的是下三角或上三角法,即通過線性變換,讓行列式變成下三角形的結果,然后對解線進行乘積即可。而在這里,因為是計算機計算,所以采用了行列式展開式的方式進行的計算,當然,使用下三角方法用計算機也是可以實現的,這兩種方法其實是兩種解決方案的思想。一種是把原始數據當成一個字符串對象,然后不停的從其中取數進行構造。使得通過構造的方式將現有對象變換成想要的結果。另一種思想是把原始數據對象當做一個完整的對象,所有的變換通過和別的對象進行運算,然后生成滿足對象的結果。
核心思想:在算法中,進行常規的數據變換,或者格式變換,許多時候,我們會選擇對索引位置進行重新排列,或者按照一定的算法進行重新排列處理,但是我們可以確定的一點是,我們的變換也可以通過運算的方式進行數據變換,讓運算的結果滿足我們的要求,而不是把對象當做字符串對象來處理。