欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

那些曾经让我们崩溃的数学运算和推导——线性代数篇(二)

程序员文章站 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列的矩阵An行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

相关标签: 线性代数