Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]


JavaScript: операции над матрицами

Операции над матрицами на JavaScript


Транспонирование матрицы


function TransMatrix(A)       //На входе двумерный массив
{
var m = A.length, n = A[0].length, AT = [];
for (var i = 0; i < n; i++)
{ AT[ i ] = [];
for (var j = 0; j < m; j++) AT[ i ][j] = A[j][ i ];
}
return AT;
}

Сложение матриц


function SumMatrix(A,B)       //На входе двумерные массивы одинаковой размерности
{
var m = A.length, n = A[0].length, C = [];
for (var i = 0; i < m; i++)
{ C[ i ] = [];
for (var j = 0; j < n; j++) C[ i ][j] = A[ i ][j]+B[ i ][j];
}
return C;
}

Умножение матрицы на число


function multMatrixNumber(a,A)  // a - число, A - матрица (двумерный массив)
{
var m = A.length, n = A[0].length, B = [];
for (var i = 0; i < m; i++)
{ B[ i ] = [];
for (var j = 0; j < n; j++) B[ i ][j] = a*A[ i ][j];
}
return B;
}

Умножение матриц


function MultiplyMatrix(A,B)
{
var rowsA = A.length, colsA = A[0].length,
rowsB = B.length, colsB = B[0].length,
C = [];
if (colsA != rowsB) return false;
for (var i = 0; i < rowsA; i++) C[ i ] = [];
for (var k = 0; k < colsB; k++)
{ for (var i = 0; i < rowsA; i++)
{ var t = 0;
for (var j = 0; j < rowsB; j++) t += A[ i ][j]*B[j][k];
C[ i ][k] = t;
}
}
return C;
}

Возведение матрицы в степень


Рекурсивный алгоритм возведения квадратной матрицы A в натуральную степень n.


function MatrixPow(n,A)
{
if (n == 1) return A; // Функцию MultiplyMatrix см. выше
else return MultiplyMatrix( A, MatrixPow(n-1,A) );
}

Определитель матрицы


function Determinant(A)   // Используется алгоритм Барейса, сложность O(n^3)
{
var N = A.length, B = [], denom = 1, exchanges = 0;
for (var i = 0; i < N; ++i)
{ B[ i ] = [];
for (var j = 0; j < N; ++j) B[ i ][j] = A[ i ][j];
}
for (var i = 0; i < N-1; ++i)
{ var maxN = i, maxValue = Math.abs(B[ i ][ i ]);
for (var j = i+1; j < N; ++j)
{ var value = Math.abs(B[j][ i ]);
if (value > maxValue){ maxN = j; maxValue = value; }
}
if (maxN > i)
{ var temp = B[ i ]; B[ i ] = B[maxN]; B[maxN] = temp;
++exchanges;
}
else { if (maxValue == 0) return maxValue; }
var value1 = B[ i ][ i ];
for (var j = i+1; j < N; ++j)
{ var value2 = B[j][ i ];
B[j][ i ] = 0;
for (var k = i+1; k < N; ++k) B[j][k] = (B[j][k]*value1-B[ i ][k]*value2)/denom;
}
denom = value1;
}
if (exchanges%2) return -B[N-1][N-1];
else return B[N-1][N-1];
}

Ранг матрицы


function MatrixRank(A)
{
var m = A.length, n = A[0].length, k = (m < n ? m : n), r = 1, rank = 0;
while (r <= k)
{ var B = [];
for (var i = 0; i < r; i++) B[ i ] = [];
for (var a = 0; a < m-r+1; a++)
{ for (var b = 0; b < n-r+1; b++)
{ for (var c = 0; c < r; c++)
{ for (var d = 0; d < r; d++) B[c][d] = A[a+c][b+d]; }
if (Determinant(B) != 0) rank = r;
} // Функцию Determinant см. выше
}
r++;
}
return rank;
}

Союзная матрица


Союзной к матрице A называют матрицу \operatorname{adj}A, которая получается из матрицы A, если все ее элементы заменить соответствующими алгебраическими дополнениями A_{i,j} и к полученной матрице применить операцию транспонирования.


function AdjugateMatrix(A)   // A - двумерный квадратный массив
{
var N = A.length, adjA = [];
for (var i = 0; i < N; i++)
{ adjA[ i ] = [];
for (var j = 0; j < N; j++)
{ var B = [], sign = ((i+j)%2==0) ? 1 : -1;
for (var m = 0; m < j; m++)
{ B[m] = [];
for (var n = 0; n < i; n++) B[m][n] = A[m][n];
for (var n = i+1; n < N; n++) B[m][n-1] = A[m][n];
}
for (var m = j+1; m < N; m++)
{ B[m-1] = [];
for (var n = 0; n < i; n++) B[m-1][n] = A[m][n];
for (var n = i+1; n < N; n++) B[m-1][n-1] = A[m][n];
}
adjA[ i ][j] = sign*Determinant(B); // Функцию Determinant см. выше
}
}
return adjA;
}

Обратная матрица


Вычисление обратной матрицы с помощью союзной матрицы (из алгебраических дополнений, см. выше).


function InverseMatrix(A)   // A - двумерный квадратный массив
{
var det = Determinant(A); // Функцию Determinant см. выше
if (det == 0) return false;
var N = A.length, A = AdjugateMatrix(A); // Функцию AdjugateMatrix см. выше
for (var i = 0; i < N; i++)
{ for (var j = 0; j < N; j++) A[ i ][j] /= det; }
return A;
}
Математический форум (помощь с решением задач, обсуждение вопросов по математике).
Кнопка "Поделиться"
Если заметили ошибку, опечатку или есть предложения, напишите в комментариях.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Яндекс.Метрика

Copyright © 2010-2022 MathHelpPlanet.com. All rights reserved