【问题标题】:Javascript det calculationJavascript检测计算
【发布时间】:2017-08-16 01:22:13
【问题描述】:

我有两个函数用于递归计算矩阵的行列式。这些值取自 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 矩阵时它没有。所以请帮忙

【问题讨论】:

标签: javascript matrix


【解决方案1】:

好的,首先,你需要把name属性放在form标签上:

<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

希望对你有帮助:)

【讨论】:

  • 好吧,我想让它通用,这样我就不必将我的 javascript 更改为另一种形式。我想使用这个算法几次。但无论如何还是谢谢
【解决方案2】:

您的 for 循环正在使用未定义的变量 'a' 和 'b'

【讨论】:

    【解决方案3】:

    您的alertreturn 之后。
    return语句之前使用alert函数

    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;
    

    【讨论】:

    • 如果我想提醒一个大于 2x2 的矩阵的 det 怎么办?这是行不通的。但无论如何都要感谢
    • 嗯,这就是我的函数的重点。如果矩阵的大小大于 2,它会递归计算
    【解决方案4】:

    当你创建“更小”时,你并没有缩小矩阵。

    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] = [];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2011-02-12
      • 2011-07-06
      • 2010-11-02
      • 2022-12-16
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多