2013-05-12 42 views
-2

我有兩個函數,我用它來遞歸地計算矩陣的行列式。這些值取自HTML表單。但功能不運行。有人能幫助我嗎?我會很感激。Javascript det計算

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); 
} 

注:一個問題是這個rec​​ursion.I試圖計算並返回和報警矩陣2×2的決定因素,它的工作。但是當我試圖用3x3矩陣做它時沒有。所以請幫助

+0

你真的應該考慮在其他職位的答案不斷開拓新的問題之前! http://stackoverflow.com/questions/16489816/javascript-matrix-inversion – 2013-05-12 12:14:50

回答

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; 
+0

仍然無法正常工作,該功能並沒有提醒任何東西 – user2167174 2013-05-12 12:09:28

+0

@ user2167174答案更新 – Ilya 2013-05-12 12:13:22

+0

如果我想警告一個矩陣的det更大的2x2?它不會工作。但總體來說 – user2167174 2013-05-12 12:32:28

0

好吧,首先,你需要將名稱屬性放在表單標籤上:

<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 

希望它能幫助:)

+0

嗯,我想使它通用,以便我不必改變我的JavaScript的另一種形式。我想要使用這個算法幾次。但是,無論如何,無論如何 – user2167174 2013-05-12 12:23:25

0

您的循環使用未定義變量'a'和'b'

+0

不,這不是一個問題 – user2167174 2013-05-12 13:09:28

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