我想, 這個教程不按照傳統的思路來寫, 畢竟實踐才是學習的最好途徑。這里在前面學習了基本的數據類型之后, 我直接跳到用Python來計算一個方塊矩陣的行列式。題目中說的范德蒙矩陣在數學上是非常經典的范例之一, 但本程序對一般的方塊矩陣也可計算。
數學知識自動略過, 不懂的話wiki下。例如啥叫范德蒙矩陣?如何按行/列展開計算一個矩陣的行列式。
范德蒙矩陣的生成
我們這里給出生成范德蒙行列式的一個方法, 其中用到了list of list(即2維array)這一數據結構。
dim = 3
# generate Vamdemon matrix of given dim
M = [[ (j + 1)**i for i in range(dim) ] for j in range(dim) ]
看到了嗎?是不是很簡單?其實這里i是列標, j是行標, range(3)
產生list:[0,1,2]
, 每個[]
里用一個for
循環產生相應的(i,j)元素
[圖片上傳失敗...(image-a379b5-1510020402646)]^i)
故上面生成的矩陣就是:
[圖片上傳失敗...(image-b796f5-1510020402646)]
矩陣維數、子矩陣、行列式
完整的源碼見后, 為了按行或列計算行列式, 我們需要:
-
subM
函數, 輸入一個矩陣, 以及行,列位置, 返回去掉該行該列的子矩陣 -
detM
函數, 計算行列式。
其中, 第一個if
用dimM
這個矩陣維數檢測函數, 判斷是不是一個方塊矩陣。然后用一個if
實行遞歸調用。中間有好幾個注釋, 都是我在寫的過程中方便調試而保留的。同樣, 我還用了一個sys.exit()
來忽略所有它之后的代碼。
cal_det.py
# -*- coding: utf-8 -*-
import sys
dim = 3
# generate Vamdemon matrix of given dim
M = [[ (j + 1)**i for i in range(dim) ] for j in range(dim) ]
def printM(M):
for row in M:
for col in row:
print(col, end=' ')
print('\n')
def dimM(M):
dim=[1,len(M[0]),len(M[0])]
for i in range(len(M)):
dim[0]=len(M)
dim[1]=min(dim[1], len(M[i]))
dim[2]=max(dim[2], len(M[i]))
if dim[1] == dim[2]:
return dim[0:2]
else:
return dim
def subM(M, row, col ):
#return the submatrix of M by removing (row,col)
sM=[rM.copy() for rM in M]
del sM[row]
for rM in sM:
del rM[col]
return [elm for elm in sM if elm !=[] ]
def detM( M ):
if dimM(M)[0] != dimM(M)[1] or len(dimM(M)) != 2:
return 'Please give a square matrix!'
if len(M) ==1:
return M[0][0]
else:
expandM=0
for i in range(len(M)):
# print('The matrix is:\n')
# printM(M)
# print('(row, col)=: ',(i+1,1), '\nSub Matrix of ', (i+1,1), ': \n')
# printM(subM(M,i,0))
expandM +=(-1)**(i)*M[i][0]*detM(subM(M, i, 0))
return expandM
#print(dimM(M))
#print(subM(M, 1,1))
printM(M)
print('The determinate of above matrix is:')
print(detM(M))
print('Test of the error detection (must square matrix):')
print(detM([[1],[1,2]]))
sys.exit()