Алгоритм поиска определителя матрицы - PullRequest
0 голосов
/ 14 декабря 2011

Мне нужно написать алгоритм, чтобы найти определитель матрицы, что делается с помощью рекурсивной функции:

enter image description here

где A_ij - это матрица, которая появляется при удалении i -ой строки и j-го столбца для 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]
] 

Ответы [ 2 ]

9 голосов
/ 14 декабря 2011

Почему ваш код не работает?

  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)
1 голос
/ 15 декабря 2011

Решает ли это вашу проблему?

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
...