Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Возведение матрицы в степень (https://javascript.ru/forum/misc/39300-vozvedenie-matricy-v-stepen.html)

harold 24.06.2013 18:20

Возведение матрицы в степень
 
Подскажите как возвести матрицу в натуральную степень?

В задании только "великая" подсказка A^n=A*A*...*A (n-раз).
Уверен есть js библиотека для работы с матрицами, но никак не найду :)

Deff 24.06.2013 18:51

http://habrahabr.ru/post/148901/

harold 24.06.2013 19:16

Цитата:

Сообщение от Deff (Сообщение 258223)

:blink:
понял только, что в статье рассматриваются единичные или почти единичные матрицы, а нужно для любых.

Demath 24.06.2013 19:47

Сначала составляете функцию перемножения двух матриц, затем рекурсивно умножаете матрицу на саму себя.


function multMatrix(A,B)
{   
    var rowsA = A.length,
        rowsB = B.length,
        colsB = B[0].length,
        C = [];

    for (var i=0; i<rowsA; i++)
     { C[i] = new Array(colsB); }

    for (var k=0; k<colsB; k++)
     { for (var i=0; i<rowsA; i++)
        { var temp = 0;
          for (var j=0; j<rowsB; j++)
           { temp += A[i][j]*B[j][k]; }
          C[i][k] = temp;
        }
     }

    return C;
}

function MatrixPow(n,A)
{  
   if (n==1) return A;
   else return multMatrix(A,MatrixPow(n-1,A));
}

harold 27.06.2013 00:01

Demath,
спасибо, выручили! :dance:
умножение двух матриц у меня получилось почти также, но рекурсию не осилил бы, не понимаю ее (

помогите еще с LU-разложением матрицы :)

Demath 29.06.2013 02:24

Цитата:

Сообщение от harold
помогите еще с LU-разложением матрицы

Например так

<script>
function LU(A)
{ 
    var n = A.length, L = [], U = A;

    for (var i=0; i<n; i++)
     { L[i] = [];
       for (var j=0; j<n; j++) L[i][j] = 0;      
     }

    for (var i=0; i<n; i++)
     { for (var j=i; j<n; j++)
         L[j][i] = U[j][i]/U[i][i];
     }
    
    for (var k=1; k<n; k++)
     { for (var i=k-1; i<n; i++)
        { for (var j=i; j<n; j++)
              L[j][i] = U[j][i]/U[i][i];
        }
       for (var i=k; i<n; i++)
        { for (var j=k-1; j<n; j++)
              U[i][j] -= L[i][k-1]*U[k-1][j];
        }
     }

    return [L,U];
}
</script>

<button onclick="a = LU([[11,21,5],[2,7,-5],[13,-19,17]]);
document.write('A = <br>'+[[11,21,5],[2,7,-5],[13,-19,17]].join('<br>')
+'<br><br>L = <br>'+a[0].join('<br>')+'<br><br>U = <br>'+a[1].join('<br>') )">
Пример для A = [[11,21,5],[2,7,-5],[13,-19,17]]</button>


Часовой пояс GMT +3, время: 21:11.