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

一、前言

上一篇做总体概论,此篇开启线性代数,主要用代码实现行列式计算、矩阵计算等功能。相信在学校的时候,我们都被运算的焦头烂额,给大家开启开挂模式。

所谓行列式和矩阵,在代码中以二维数组形式表现,灵活运用数组运算可得结果

二、运算和推导

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值