2011-12-14 20 views
0

私は再帰関数で行われる行列の行列式を見つけるためにアルゴリズムを記述する必要があります。アルゴリズムは、行列の行列を見つけるために

enter image description here

A_ijが行列で、表示されますの列のijの列を削除したときに発生します。 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

+0

あなたはこれまで何を持っていますか?どこにこだわっていますか? –

+0

申し訳ありませんが、私は忘れてしまった.. ここまでは私のコードですが、動作しません: det1 [Mi_ /; [det1 == 1、 Break []、( - )が0の場合、[det1 == 1、 の場合、[Det1 == 1、 の場合、 1、j]]]、{j、 1、Length [Mi]}]; Return [det1 // MatrixForm、Module]] – user1098185

答えて

9

ないのはなぜあなたのコードで動作しますか?

  1. MatrixForm(ディスプレイ)をフォーマットするために使用されるが、行列形式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) 
+0

ラプラスの式はこれにどのように関与していますか?私は混乱して、ごめんなさい – user1098185

+3

あなたが投稿した同じ公式を意味する:http://en.wikipedia.org/wiki/Laplace_expansion – Szabolcs

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 
+0

ありがとう、それは大きな助けとなった – user1098185

関連する問題