矩阵行列式.数字比较的问题

AngularJS: Matrix determinant. Issue with number comparison?

本文关键字:问题 比较 数字 行列式      更新时间:2023-09-26

我从这里的一个问题找到了一个javascript行列式算法。我的应用程序似乎工作得很好,只要矩阵是2x2。超过这个值,算法就不能正确计算行列式。

我尝试逐行调试,似乎没有满足某些'if'条件。

这是我的整个脚本。你可以向下滚动到底部,找到calcRec函数并寻找注释,上面写着"//以下两个条件都不满足。"这就是我不明白的问题所在。你可以在这里找到答案

var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {

$scope.matrix = [[{"val":0},{"val":1}],[{"val":3},{"val":4}]]
var rowLength = $scope.matrix[0].length;
var colLength = $scope.matrix.length;

var addRow = function()
{
this.rowLength = $scope.matrix[0].length;
this.colLength = $scope.matrix.length;
var array = [];
for(var i=0;i<this.rowLength;i++)
{
  array.push({"val":0});
}
$scope.matrix.push(array);
};
 var addCol = function()
{
this.rowLength =   $scope.matrix[0].length;
this.colLength = $scope.matrix.length;
for(var i=0;i<this.colLength;i++)
{
  $scope.matrix[i].push({"val":0});
}
};
var removeRow = function()
{
this.rowLength =   $scope.matrix[0].length;
this.colLength = $scope.matrix.length;
$scope.matrix.splice(this.colLength-1,1);
};
var removeCol = function()
{
this.rowLength =   $scope.matrix[0].length;
this.colLength = $scope.matrix.length;
for(var i=0;i<this.colLength;i++)
{
  $scope.matrix[i].splice(this.rowLength-1,1);
}
};
$scope.increaseSize = function()
{
addCol();
addRow();
$scope.updateDeterminant();
};
$scope.decreaseSize = function()
{
removeCol();
removeRow();
$scope.updateDeterminant();
};
$scope.updateDeterminant = function()
{
var tempMatrix = $scope.matrix;
var k = this.rowLength;
$scope.determinantValue = calcRec(tempMatrix);
//To be continued.
};

var calcRec = function(A) 
{
    var s;
    var k = this.rowLength;
    var det = 0;
    if (A.length == 1) 
    { //bottom case of the recursive function 
        return A[0][0].val;
    }
    if (A.length == 2) 
    {       
        det =  A[0][0].val * A[1][1].val - A[1][0].val * A [0][1].val;
        return det;
    }
    for (var i = 0; i < this.k; i++) 
    {
        //creates smaller matrix- values not in same row, column
        var smaller = new Array(A.length - 1);
        for (var h = 0; h < smaller.length; h++) 
        {
            smaller[h] = new Array(A.length - 1);
        }
        for (var a = 1; a < A.length; a++) 
        {
            for (var b = 0; b < A.length; b++) 
            {
                //Neither of the below 2 conditions are fulfilled.
                if (b<i) 
                {
                    smaller[a-1][b].val = A[a][b].val;
                } 
                else if(b>i) 
                {
                    smaller[a - 1][b - 1].val = A[a][b].val;
                }
            }
        }
        if (i % 2 === 0) {
            s = 1;
        } else {
            s = -1;
        }
        det += s * A[0][i].val * (calcRec(smaller));
    }
    return (calcRec(A));
}
});

我的HTML代码在这里,不是你需要它

<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.2.x"  src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js" data-semver="1.2.16"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<span ng-repeat="rows in matrix track by $index"><br>
  <span ng-repeat="element in rows track by $index">
    <textarea ng-change="updateDeterminant()" ng-model="matrix[$parent.$index]  [$index].val" rows="1" cols="1"></textarea>
  </span>
</span><br>

<button ng-click="increaseSize()">Increase Size</button><br>
<button ng-click="decreaseSize()">Decrease Size</button>
Determinant is {{determinantValue}}

</body>
</html>

在第98行,初始化一个未定义的

数组
smaller[h] = new Array(A.length - 1);

原因显而易见

smaller[a-1][b].val

抛出一个错误,提示"TypeError: Cannot set property 'val' of undefined"

解决了。我创建较小矩阵的方法有一个问题。

初始代码
var smaller = new Array(A.length - 1);
for (var h = 0; h < smaller.length; h++) 
{
    smaller[h] = new Array(A.length - 1);
}

修正代码

var smaller = [];
for(var newvar=0;newvar<A.length-1;newvar++)
{
    var array = []
    for(var m=0;m<A.length-1;m++)
    {
      array.push({"val":0});
    }
    smaller.push(array);
}

事实证明,在javascript中处理数组时需要小心。这是我的铅块。它现在适用于所有的nxn矩阵