我正在尝试编写一个函数来计算一个sqaured-matrix行列式(其中所有对角线的数字都乘以)用于自编码。我得到了主要想法,但由于一些计算错误,我无法得到正确的结果。这是我写的代码:
public static int det(int[][] matrix, int n) {
int i,j, k, det=1;
for (i=0; i < matrix.length; i++) {
for (j=0; j < matrix[i].length; j++) {
if (i<j)
if(matrix[i][j] == 0) {
//isTriangle = true;
det *= matrix[i][i];
}
if (i>j)
if (matrix[i][j] == 0) {
//isTriangle = true;
det *= matrix[i][i];
}
}
}
return det;
}
运行此函数后,我得到的结果不包括最终数字(matrix [n] [n]),因为它没有因某种原因而成倍增加。接下来我尝试设置一个for循环,将两个循环外的对角线的所有成员(det * = matrix [k] [k])相乘,但结果我得到了非常高的数字。我这里的数学怎么办?
答案 0 :(得分:1)
您的算法不正确。它应该是这样的:
使用高斯消元法使输入矩阵成三角形。
将对角线上的所有数字相乘(即找到所有matrix[i][i]
的{{1}}的乘积。)
你不能跳过第一步。
答案 1 :(得分:1)
您也可以使用递归。
给定n乘n矩阵M,我们通过敲出M的第i列和第j行来创建W(i,j)。
因此对于3 x 3矩阵:
1 2 3
4 5 6
7 8 9
W(0,0) =
5 6
8 9
W(1,0) =
4 6
7 9
等
现在,您可以展开任何行或列。
此外,你需要交替+和 - ;对于3 x 3矩阵,它看起来像这样:
+ - +
- + -
+ - +
因此,围绕第2列展开,我们得到:
+ 3 * det
4 5
7 8
- 6 * det
1 2
7 8
+ 9 * det
1 2
4 5
或
-1^(2+0) * M(2,0)*det(W(2,0))
+ -1^(2+1) * M(2,1)*det(W(2,1))
+ -1^(2+2) * M(2,2)*det(W(2,2))
我故意从榜样开始,因为公式看起来有点可怕:
det(M) = sum(i=0 to N-1){ -1 ^ i * M(i,0) * det(W(i,0)) }
请注意,在此公式中,我们围绕第一行(而不是之前的第三列)展开