Javascript det计算

时间:2013-05-12 12:01:28

标签: javascript matrix

我有两个函数用于递归计算矩阵的行列式。值来自HTML表单。但功能不运行。有人可以帮我这个吗?我将非常感激。

HTML

<form>
    element 0_0 <input type = "text" class = "elements"/>
    element 0_1 <input type = "text" class = "elements"/>
    element 1_0 <input type = "text" class = "elements"/>
    element 1_1 <input type = "text" class = "elements"/>
    <input type = "button" value = "clickMe" onclick = "determinant('elements','class')"/>
</form>

的JavaScript

function create2Darray(clname){
    var A = document.getElementsByClassName(clname);
    var arr = new Array();
    var rows = Math.sqrt(A.length);
    for(var i = 0; i < rows; i++){
        arr[i] = new Array();
        for(var j = 0; j < rows;j++){
            arr[i][j] = A[i*rows + j].value;
        }
    }
    return arr;
}

function determinant (matrixClass,type) {
    if(type == 'class'){
        var matrix = create2Darray(matrixClass);
    } else if(type == 'name'){
        var matrix = new Array();
    }
    var det = 0;
    if (matrix.length == 1){
        return matrix[0][0];
    } else if (matrix.length == 2){
        return (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    }

    var smaller = new Array();//creating an empty array for a matrix minor;
    for (var k = 0; k < matrix.length; k++){
        smaller[k] = [];
        for(var l = 0;l < matrix.length; l++){
            smaller[k][l] = [];
        }
    }       

    for (var i = 0; i < matrix.length; i++){
        for (a = 1; a < matrix.length; a++) {
            for (b = 0; b < matrix.length; b++) {
                if (b < i) {
                    smaller[a - 1][b] = matrix[a][b];
                } else if (b > i) {
                    smaller[a - 1][b - 1] = matrix[a][b];
                }
            }
        }
        if (i % 2 == 0) {
            s = 1;
        } else {
            s = -1;
        }
        det += s * matrix[0][i] * (determinant(smaller,'name'));
    }
    return det;
    alert(det);
}

注意:问题在于这个递归。我尝试计算并返回并警告矩阵2x2的行列式并且它有效。但是当我尝试使用3x3矩阵时它没有。所以请帮助

4 个答案:

答案 0 :(得分:0)

您的alertreturn之后 在alert声明

之前使用return功能
alert(det);  
return det;  
代码函数中的

返回此案例

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

你应该在这里发出警报

det = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);  
alert (det);  
return det;

答案 1 :(得分:0)

好的,首先,您需要将name属性放在表单标记上:

<form name="det">

然后,输入您的输入值名称。例如:

element 0_0 <input type = "text" class = "elements" NAME="A"/>
element 0_1 <input type = "text" class = "elements" NAME="B"/>
element 1_0 <input type = "text" class = "elements" NAME="C"/>
element 1_1 <input type = "text" class = "elements" NAME="D"/>
<input NAME="E" type = "button" value = "clickMe" onclick = "determinant('elements','class')"/>

最后,现在您已经命名了所有内容,您可以使用以下命令获取javascript中的值:

document.*formname*.*input name*.value

希望有所帮助:)

答案 2 :(得分:0)

你的for循环使用未定义的变量'a'和'b'

答案 3 :(得分:0)

当您创建“较小”时,您没有缩小矩阵。

for (var k = 0; k < matrix.length; k++){
    smaller[k] = [];
    for(var l = 0;l < matrix.length; l++){
        smaller[k][l] = [];
    }
}

应该是:

for (var k = 0; k < matrix.length - 1; k++) {
    smaller[k] = [];

    for(var l = 0; l < matrix.length - 1; l++) smaller[k][l] = [];
}