那些曾经让我们崩溃的数学运算和推导——线性代数篇(二)
程序员文章站
2022-03-05 20:30:13
...
一、前言
上一篇做总体概论,此篇开启线性代数,主要用代码实现行列式计算、矩阵计算等功能。相信在学校的时候,我们都被运算的焦头烂额,给大家开启开挂模式。
所谓行列式和矩阵,在代码中以二维数组形式表现,灵活运用数组运算可得结果
二、运算和推导
1. 行列式计算(二阶、三阶、n阶)
如下部分代码,n阶行列式后续补充
二三阶行列式使用对角线法则运算
n阶行列式使用逆序数概念运算
/**
* 二阶行列式计算
* @description |a11 a12|
* |a21 a22|
* 对角线法则
* @param {Array} detArray 二维数组 [[a11, a12],[a21,a22]]
* @returns a11 * a22 - a12 * a21
*/
function secondOrderDeterminant(detArray) {
var result = null;
if (detArray) {
result = detArray[0][0] * detArray[1][1] - detArray[0][1] * detArray[1][0];
}
return result;
}
/**
* 三阶行列式计算
* @description |a11 a12 a13|
* |a21 a22 a23|
* |a31 a32 a33|
* 对角线法则
* @param {Array} detArray 二维数组 [[a11, a12, a13],[a21, a22, a23],[a31, a32, a33]]
* @returns a11 * a22 * a33 + a12 * a23 * a31 + a13 * a32 * a21 - a13 * a22 * a31 - a12 * a21 * a33 - a11 * a32 * a23
*/
function thirdOrderDeterminant(detArray) {
var result = null;
if (detArray) {
result =
detArray[0][0] * detArray[1][1] * detArray[2][2] +
detArray[0][1] * detArray[1][2] * detArray[2][0] +
detArray[0][2] * detArray[2][1] * detArray[1][0] -
detArray[0][2] * detArray[1][1] * detArray[2][0] -
detArray[0][1] * detArray[1][0] * detArray[2][2] -
detArray[0][0] * detArray[2][1] * detArray[1][2];
}
return result;
}
/**
* n阶行列式
* @param {*} detArray
*/
function multiOrderDetermainant(detArray) {}
2. 矩阵运算(部分代码)
矩阵相加,注意相加矩阵行列数相同
矩阵相乘,注意相乘矩阵m行n列的矩阵A和n行m列的矩阵B,相乘结果矩阵m行m列矩阵C
/**
* 矩阵相加
* @param {Array} matrixA
* @param {Array} matrixB
*/
function matrixAdd(matrixA, matrixB) {
if (matrixA.length !== matrixB.length) {
throw Error('两矩阵行列数不一致');
}
return matrixA.map(function(arrayObj, i) {
return arrayObj.map(function(value, j) {
return value + matrixB[i][j];
});
});
}
/**
* 矩阵相乘(复杂度有待优化)
* @param {Array} matrixA eg:A3*2 [[1,4],[2,5],[3,6]]
* @param {Array} matrixB eg: B2*3 [[1,2,3],[4,5,6]]
* @description Am*n X Bn*m = Cm*m
*/
function matrixMultiply(matrixA, matrixB) {
let matrixC = new Array(matrixA.length);
if (!matrixA.length || !matrixB.length) {
throw Error('矩阵不合理');
}
//构建数组
matrixA.forEach((arrayObj, i) => {
matrixC[i] = [];
for (let index = 0; index < matrixB[0].length; index++) {
matrixC[i].push(0);
}
});
matrixC.forEach((array, i) => {
matrixC[i].forEach((value, j) => {
//注意,此处遍历,只是为获取matrixA[i]长度,累加数值
matrixA[i].forEach((v, k) => {
matrixC[i][j] += matrixA[i][k] * matrixB[k][j];
});
/* for (let index = 0; index < matrixC[i].length; index++) {
cmatrixC[i][j] += matrixA[i][j] * matrixB[j][j]
} */
// matrixC[i][j] = matrixA[i][0] * matrixB[0][j] + matrixA[i][1] * matrixB[1][j] + matrixA[i][2] * matrixB[2][j];
});
});
return matrixC;
}
export { matrixAdd, matrixMultiply };
三、后序
项目代码地址
https://github.com/yangdengxian/collegeMathCodes.git
后续补充其他章节运算,目录参考地址
https://blog.csdn.net/yangdengxian/article/details/96374805