计算矩阵的行列式

时间:2017-06-10 15:14:05

标签: javascript arrays algorithm matrix

我正在尝试计算JS中矩阵的行列式。我使用了来自http://www.sanfoundry.com/java-program-compute-determinant-matrix/的算法但我在最后一个条件下失去了理智。我只是不明白。你能帮助我吗?

这就是我现在的代码。在另一个函数中,我创建一个空的2d数组,然后将其复制到det函数。接下来,我从html中检索值,然后尝试计算矩阵的行列式。前两种情况很简单,但最后一种情况有问题。我在JS中找不到工作示例。

function det() {
  var det = 0;
  var array1 = array.slice();

  for (i = 0; i < array1.length; i++) {

    for (j = 0; j < array1[i].length; j++) {
      array1[i][j] = parseInt(document.getElementById("element" + (i + 1) + (j + 1)).value, 10);
    }

  }

  if (array1.length == 1) {
    det = array1[0][0];
  } else if (array1.length == 2) {
    det = (array1[0][0] * array1[1][1]) - (array1[1][0] * array1[0][1]);
  } else {

  }

}

2 个答案:

答案 0 :(得分:1)

您可以在此处查看方形矩阵的行列式的定义https://en.wikipedia.org/wiki/Determinant#n_.C3.97_n_matriceshttp://www.sanfoundry.com/java-program-compute-determinant-matrix/中使用的算法使用determinat的某些属性以递归方式计算它作为所有排列的总和。通过这种方式,您可以获得N * N!次操作!即使是小N,它也非常大。

为了解决这个问题,您可以先使用相同的行列式将矩阵转换为三角形,然后将行列式计算为所有对角元素的乘积。

答案 1 :(得分:1)

我可能会建议我基于递归算法的解决方案,该解决方案仅需要几行代码,并且我认为它将适合大多数实际应用:

const determinant = m => 
  m.length == 1 ?
  m[0][0] :
	m.length == 2 ? 
	m[0][0]*m[1][1]-m[0][1]*m[1][0] :
	m[0].reduce((r,e,i) => r+(-1)**(i+2)*e*determinant(m.slice(1).map(c => c.filter((_,j) => i != j))),0);

const test1 = [[3]];                      // 3
const test2 = [[3,-2],[7,4]];             // 26
const test3 = [[1,3,7],[2,-1,4],[5,0,2]]; // 81

console.log(determinant(test1));
console.log(determinant(test2));
console.log(determinant(test3));
.as-console-wrapper {min-height: 100%}