2013-05-12 2 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); 
} 

ПРИМЕЧАНИЕ: проблема с этим recursion.I попытался расчета и возврата и предупреждая определитель матрицы 2х2, и она работала. Но когда я попытался сделать это с помощью матрицы 3x3, это не помогло. Пожалуйста, помогите

+0

Вы должны реально смотреть на ответы на другие должности, прежде чем постоянно открывать новые вопросы! http://stackoverflow.com/questions/16489816/javascript-matrix-inversion –

ответ

0

Ваш alert после return.
Использование 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

+0

@ user2167174 ответ обновлен – Ilya

+0

И что, если я хочу предупредить det матрицы больше, чем 2x2? Это не сработает. Но в любом случае – user2167174

0

Ok, в первую очередь, вам нужно поместите атрибут 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 

Надеется, что это помогает :)

+0

Ну, я хочу сделать ее универсальной, чтобы мне не пришлось менять свой javascript для другой формы. I хочу использовать этот алгоритм пару раз. Но в любом случае – user2167174

0

Ваших за петлю с помощью неопределенной переменные 'a' и 'b'

+0

Нет, это не проблема – user2167174

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] = []; 
} 
Смежные вопросы