Javascript矩阵求逆

时间:2013-05-10 19:49:37

标签: javascript matrix matrix-inverse

我正在为矩阵反转创建一个javascript代码。但是这个函数似乎没有运行。 我希望我的倒置矩阵显示在输入矩阵所在的位置。我已经尝试提醒flipMatrix的值而不是将它们放入s但是也没有用。感谢任何帮助

HTML

<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>

的javascript

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

编辑!:如果条件检查应该有i == 0 ||我= = 2而不是我写的。但是仍然无法工作。

1 个答案:

答案 0 :(得分:0)

您还可以查看支持任何维度矩阵的我的(正在进行中)库matrix.js(如果您不需要,可以在此处停止阅读,因为任意大小会增加极端开销)。

反转的相关代码是

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

但是,您可以看到它对LU分解有一些依赖性,例如。如果您有兴趣,请看一下。到目前为止,倒数并不是最佳解决方案,而是基本的解决方案。