Javascript矩阵反转

Javascript matrix inversion

本文关键字:Javascript      更新时间:2023-09-26

我正在创建矩阵反转的javascript代码。但是这个函数似乎没有运行。我希望我的逆矩阵显示在输入矩阵所在的位置。我试过提醒invertedMatrix的值,而不是把它们放入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;
}
}

编辑!:if条件检查应该是I == 0 || I == 2,而不是我写的。

你也可以看看我的(正在进行的)库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分解,例如。如果你感兴趣,可以看看。到目前为止,逆解并不是最优解,但相当基本。