2013-05-10 1 views
1

행렬 역변환을위한 자바 스크립트 코드를 작성 중입니다. 그러나 함수가 실행되지 않는 것처럼 보입니다. 나는 내 역 행렬 입력 행렬 이라고요가 invertedMatrix의 값을 경고 대신의에 넣어 시도 어디에 표시 할 수 있지만 어떤 도움자바 스크립트 행렬 반전

HTML

에 대한 감사 either.Would 작동하지 않았다 싶어
<div id = "table3"> 
<div class = "header">Macierz odwrotna [2x2]</div> 
<form id = "row1"> 
    <input type = "text" class = "det2"/><!--first row--> 
    <input type = "text" class = "det2"/> 
</form> 
<form id = "row2"> 
    <input type = "text" class = "det2"/><!--second row--> 
    <input type = "text" class = "det2"/> 
</form> 
<div class = "count" onclick="invertedMatrix(2,'det2')"><a href = "#">Wylicz</a> </div> 
</div> 

자바 스크립트

function det(size, className){ 
var arr = document.getElementsByClassName(className); 
var determinant = 0; 
if(size == 2){ 
determinant = (arr[0].value*arr[3].value) - (arr[1].value*arr[2].value); 
} 
else if(size == 3){ 
determinant = (arr[0].value*((arr[4].value*arr[8].value) - (arr[5].value * arr[7].value))) - 
(arr[1].value*((arr[3].value*arr[8].value) - (arr[5].value * arr[6].value))) + 
(arr[2].value*((arr[3].value*arr[7].value) - (arr[4].value * arr[6].value))); 
} 
return determinant; 
} 

function invertedMatrix(size,className){ 
var invertedMatrix = new Array(); 
var additionalMatrix = new Array(); 
var matrix = document.getElementsByClassName(className); 
if(size == 2){ 
    for(var i = 0; i < matrix.length;i++){ 
     if(i % 2 == 0){ 
      additionalMatrix[i].value = matrix[i].value; 
     } 
     else{ 
      additionalMatrix[i].value = -matrix[i].value; 
     } 
    } 
    for(var i = 0;i < matrix.length;i++){ 
     invertedMatrix[i].value = (1/det(2,className)) * additionalMatrix[i].value; 
    } 
} 
for(var i = 0;i < matrix.length; i++){ 
document.getElementsByClassName(className).item(i).value = invertedMatrix[i].value; 
} 
} 

편집 :! 조건 검사를 의뢰하십시오 내가 == 0 || 내가 작성한 것 대신에 i == 2. 그러나 어쨌든 여전히 작동하지 않을 것입니다.

+1

난 정말 DOM에서 행렬을 읽고 그 행렬과 역함수를 계산하는 코드에서 DOM에 쓰는 코드를 분리해야한다고 생각합니다. 이것은 너무 얽혀있다. –

답변

0

임의의 크기의 행렬을 지원하는 내 (작업 중) 라이브러리 matrix.js을 살펴볼 수도 있습니다. 필요하지 않은 경우 임의의 크기가 극단적 인 오버 헤드를 추가하므로 여기에서 읽지 않아도됩니다.

반전의 관련 코드는 당신은 예를 들어, LU 분해 일부 종속성이 볼 수 있습니다, 그러나

Matrix.prototype.inverse = function() { 
    if(!this.isSquare()) { 
     throw new MatrixError(MatrixError.ErrorCodes.DIMENSION_MISMATCH, 'Matrix must be square'); 
    } 

    var M = this.augment(Matrix.eye(this.rows())), 
     row, row_before, new_row, i, j, k, factor, rows, columns; 

    try { 
     M = M.decomposeLU(); 
     rows = M.rows(); 
     columns = M.columns(); 

     for(i = rows; i > 1; i--) { 
      row_before = M.__getRow(i - 1); 
      row = M.__getRow(i); 
      factor = row_before[i - 1]/row[i - 1]; 

      new_row = []; 
      for(k = 0; k < columns; k++) { 
       new_row[k] = row_before[k] - row[k] * factor; 
      } 
      M.__setRow(i - 1, new_row); 
     } 

     for(j = 1; j <= rows; j++) { 
      row = M.__getRow(j); 
      new_row = []; 

      for(k = 0; k < columns; k++) { 
       new_row[k] = row[k]/row[j - 1]; 
      } 

      M.__setRow(j, new_row); 
     } 
    } catch(e) { 
     throw new MatrixError(MatrixError.ErrorCodes.MATRIX_IS_SINGULAR); 
    } 

    return M.submatrix(1, rows, this.columns() + 1, columns); 
}; 

입니다. 관심이 있으시면 살펴보십시오. 역관계는 지금까지는 최적의 솔루션이 아니지만 오히려 기본입니다.