2011-12-14 76 views
0

我必須寫一個算法找到一個矩陣,它與遞歸函數所做的決定因素:算法找到一個矩陣的行列式

enter image description here

其中A_ij是矩陣,從而出現當您刪除i th行和j th列A。當A的維數爲n x n時,則A_ij的維數爲(n-1) x (n-1)。我不允許使用Minor[]Det[]

如何編寫此算法?


這是我的代碼至今:

det1[Mi_ /; Dimensions[Mi][[1]] == Dimensions[Mi][[2]]] := 
    Module[{det1}, 
    det1 = Sum[ 
     If[det1 == 1, Break[], (-1)^(1 + j) *Mi[[1, j]]*det1[Drop[Mi, {1}, {j}]]], 
     {j, 1, Length[Mi]}]; 
    Return[det1 // MatrixForm, Module] 
] 
+6

這是功課任何機會? – Szabolcs 2011-12-14 16:08:50

+0

到目前爲止你有什麼?你卡在哪裏? – 2011-12-14 16:11:35

+0

對不起,我忘了.. 這是我的代碼,直到現在,但不起作用: det1 [Mi_ /;模塊[{det1}, det1 = Sum [ ]如果[det1 == 1, Break [],( - 1)^(1 + j)* Mi [[1,j]] * det1 [Drop [Mi,{1},{j}]]],{j, 1,Length [Mi]}]返回[det1 // MatrixForm,模塊]] – user1098185 2011-12-14 16:32:48

回答

9

爲什麼沒有你的代碼的工作?

  1. MatrixForm用於格式化(顯示器),但一個陣列式包裹的基質不能在計算中使用。你只需要刪除它。

  2. 想想你的遞歸停止條件:1 * 1矩陣的行列式只是矩陣的單個元素。在此基礎上重寫和If。如果矩陣大小爲1,則返回其元素(Break[]不可能在遞歸中出現)。

  3. 不要使用與您的函數具有相同名稱的局部變量:這會掩蓋全局函數並使其無法遞歸調用。

  4. 最後,這不是中斷的功能,但明確Return是沒有必要的。 CompoundExpression的最後一個值簡單地返回。


總之,det[m_] := If[Length[m] == 1, m[[1,1]], (Laplace expansion here)]。另一種方法是使用模式匹配來識別大小爲1的矩陣:

Clear[det] 
det[{{x_}}] := x 
det[m_] := (Laplace expansion) 
1

這是否解決了您的問題?

Clear[det]; 
det[{{x_}}] := x; 
det[a_ /; MatrixQ[a] && SameQ @@ Dimensions[a]] := 
Sum[(-1)^(1 + i) a[[1, i]] det[Drop[a, {1}, {i}]], {i, 1, Length[a]}]; 
det::gofish = "Unable to handle this type of input: ``"; 
det[a___] := (Message[det::gofish, HoldForm[det][a]]; $Failed) 

例如,這樣的:

In[]:= 

m = {{a, b, c}, {c, d, e}, {f, g, h}}; 
Det[m] === Expand[det[m]] 

給出:

Out[]= 

True