【问题标题】:compute determinant of a matrix计算矩阵的行列式
【发布时间】:2017-06-10 15:14:04
【问题描述】:

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

这就是我现在的代码的样子。在另一个函数中,我创建了一个空的二维数组,然后将其复制到 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 {

  }

}

【问题讨论】:

  • 在最后一个条件中,您创建一个子矩阵array1,删除a0j 处的行和列,其中j0N,乘以@987654329 @ 和 det(subarray) 和乘积之和是最终的 determinant ,也就是 determinant 的定义,递归调用之前写的代码只是填充子数组而已
  • 递归很好,但要注意 js stackoverflow.com/questions/37224520/…

标签: javascript arrays algorithm matrix


【解决方案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%}

【讨论】:

    【解决方案2】:

    您可以在https://en.wikipedia.org/wiki/Determinant#n_.C3.97_n_matrices 处查看方阵行列式的定义。 http://www.sanfoundry.com/java-program-compute-determinant-matrix/ 中使用的算法使用确定性的一些属性以递归方式计算它作为所有排列的总和。这样你就可以得到N * N! 操作!即使是很小的N,它也很大。

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

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2011-02-24
      • 2013-12-31
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多