我必须编写一个算法来查找矩阵的行列式,这是通过递归函数完成的:
其中A_ij
是矩阵,当您删除i
的{{1}}行和j
列时,会显示该矩阵。当A
具有维度A
时,n x n
的维度为A_ij
。我不允许使用(n-1) x (n-1)
或Minor[]
。
如何编写此算法?
这是我到目前为止的代码:
Det[]
答案 0 :(得分:9)
为什么你的代码不起作用?
MatrixForm
用于格式化(显示),但MatrixForm包装的矩阵不能用于计算。您只需将其删除即可。
考虑一下递归的停止条件:1 * 1矩阵的行列式只是矩阵的单个元素。根据此值重写总和If
。如果矩阵的大小为1,则返回其元素(递归时不可能Break[]
)。
不要使用与您的函数同名的局部变量:这会掩盖全局函数,并且无法以递归方式调用。
最后,这不会中断该函数,但不需要显式的Return
。只返回CompoundExpression
的最后一个值。
总结一下,det[m_] := If[Length[m] == 1, m[[1,1]], (Laplace expansion here)]
。另一种方法是使用模式匹配来识别size-1矩阵:
Clear[det]
det[{{x_}}] := x
det[m_] := (Laplace expansion)
答案 1 :(得分: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