矩阵行列式.数字比较的问题
AngularJS: Matrix determinant. Issue with number comparison?
我从这里的一个问题找到了一个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矩阵
相关文章:
- 使用jquery进行整数比较时遇到问题
- Javascript数组比较问题
- 在javascript中面临比较问题
- 菜单不是绝对的href与位置href问题进行比较
- Linqjs 与比较器问题相交
- 在 javascript 中比较字符串与日期时间的问题
- 带有反斜杠的 Javascript 字符串比较问题
- 交换机/比较语句问题
- javascript中比较两个数字的问题
- JavaScript中的字符串比较问题
- JQuery选择器性能和比较问题
- Jquery if else比较查询问题
- 比较日期问题- javascript
- 矩阵行列式.数字比较的问题
- typeof == "undefined"比较日期,新的日期,数学.这个简单的js代码有什么问题?
- Javascript两个日期时间比较问题
- Javascript-比较日期时出现问题
- AngularJS过滤器问题:仅比较字符串的一部分(子字符串)
- 问题:将对象与对象数组进行比较
- datejs 的 JavaScript 日期比较问题