當我給出一個 3X3 矩陣作為輸入時,它在行回傳索引錯誤:m[0][0]*m[1][1]-m[0][1]*m[1][0]
import copy
def matrixdeterminant(m):
if len(m)==1:
return m[0]
elif len(m)==2:
return m[0][0]*m[1][1]-m[0][1]*m[1][0]
else:
matrixdeterminantlist=copy.deepcopy(m)
determinantlist=[]
m.pop(0)
for i in range(len(matrixdeterminantlist[0])):
for j in range(len(m)):
m[j].pop(i)
determinantlist.append(matrixdeterminantlist[0][i]*matrixdeterminant(m)*(-1)**(i 2))
m=copy.deepcopy(matrixdeterminantlist)
return sum(determinantlist)
uj5u.com熱心網友回復:
我能發現的第一個問題是:你寫的return m[0]而不是return m[0][0]針對len(m) == 1.
如果m是 1x1 矩陣,那么它看起來像[[x]],并且您想要回傳x,而不是[x],因此您必須回傳m[0][0],而不是m[0]。
代碼中的另一個重要問題是您從中彈出元素m然后嘗試m從其副本恢復的方式。這太復雜了,你m在回圈內部錯誤地恢復了,所以在某些點上的尺寸m都搞砸了。我建議完全避免使用.pop,而是使用list comprehensions構建子矩陣。
這是一個簡化版本:
def matrixdeterminant(m):
if len(m)==1:
return m[0][0]
elif len(m)==2:
return m[0][0]*m[1][1]-m[0][1]*m[1][0]
else:
determinantlist=[]
sign = 1
for i in range(len(m)):
submatrix = [row[1:] for j,row in enumerate(m) if j != i]
minor = matrixdeterminant(submatrix)
determinantlist.append(sign * m[i][0] * minor)
sign *= -1
return sum(determinantlist)
這是另一個版本:
from itertools import cycle
def matdet(m):
if len(m) == 1:
return m[0][0]
else:
return sum(
s * mj[0] * matdet([row[1:] for i,row in enumerate(m) if i != j])
for s,(j,mj) in zip(cycle([1,-1]), enumerate(m))
)
一旦它的生產數值,而不是錯誤資訊,我強烈建議您通過標準的Python模塊,如比較其對大隨機矩陣輸出,對一個矩陣行列式函式的輸出來測驗你的決定作用numpy或sympy或scipy:
- 麻木:
numpy.linalg.det; - scipy:
scipy.linalg.det; - 同情:
Matrix.det。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344902.html
上一篇:合并排序實作JavaScript
下一篇:如何使用遞回輸出這個數字
