计算矩阵平方决定因子

时间:2015-01-22 21:09:56

标签: java loops math matrix multiplying

我正在尝试编写一个函数来计算一个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])相乘,但结果我得到了非常高的数字。我这里的数学怎么办?

2 个答案:

答案 0 :(得分:1)

您的算法不正确。它应该是这样的:

  1. 使用高斯消元法使输入矩阵成三角形。

  2. 将对角线上的所有数字相乘(即找到所有matrix[i][i]的{​​{1}}的乘积。)

  3. 你不能跳过第一步。

答案 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)) }

请注意,在此公式中,我们围绕第一行(而不是之前的第三列)展开