0

我必须编写一个算法来找到矩阵的行列式,这是用递归函数完成的:

在此处输入图像描述

哪里A_ij是矩阵,当你删除第ith 行和第jth 列时出现A。当A有维度n x n时,则维度A_ij(n-1) x (n-1)。我不允许使用Minor[]or 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]
] 
4

2 回答 2

9

为什么你的代码不起作用?

  1. MatrixForm用于格式化(显示),但不能在计算中使用 MatrixForm 包裹的矩阵。你只需要删除它。

  2. 考虑一下递归的停止条件:1*1 矩阵的行列式只是矩阵的单个元素。重写总和并If以此为基础。如果矩阵的大小为 1,则返回其元素(不可能Break[]退出递归)。

  3. 不要使用与您的函数同名的局部变量:这会掩盖全局函数并使其无法递归调用。

  4. 最后,这不会破坏函数,但Return不需要显式。CompoundExpression简单地返回a 的最后一个值。


总结一下,det[m_] := If[Length[m] == 1, m[[1,1]], (Laplace expansion here)]。另一种方法是使用模式匹配来识别 size-1 矩阵:

Clear[det]
det[{{x_}}] := x
det[m_] := (Laplace expansion)
于 2011-12-14T16:54:59.993 回答
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
于 2011-12-14T23:19:38.360 回答