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

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

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

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

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


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

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


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


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

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


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


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 + 4 часа [ Летнее время ]


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

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