[从头学数学] 第202节 矩阵与变换

在星历2016年,银河系厄尔斯星球的中华帝国江南行省,工程师阿伟与机器小伟共同探讨了数学中的重要概念——矩阵与变换。他们深入研究了矩阵的性质及其在几何变换中的应用。
摘要由CSDN通过智能技术生成
剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第七转的修炼。
这次要研究的是[矩阵与变换]。

正剧开始:


星历2016年05月02日 13:26:38, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[矩阵与变换]。































<span style="font-size:18px;">	if (1) {
		var mathText = new MathText();		
		var matrix = new Matrix();
		
		var x = y = 20;
		
		//希腊字母表(存此用于Ctrl C/V
			//ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ
			//αβγδεζηθικλμνξοπρστυφχψω
		

		//例3
		
		var A = [[1, 1], [0, 1]];
		var B = [[1, -1], [-2, 3]];
		var mulAB = matrix.multiple(A, B);
		
		mathText.printMatrix(mulAB, x, y, 100);
		
		x+=120;
		A = [[1, 2], [3, 4]];
		B = [[0, 1], [1, 0]];
		mulAB = matrix.multiple(A, B);
		
		mathText.printMatrix(mulAB, x, y, 100);
		
		
		//例
		A = [[1, 1], [0, 1]];
		B = matrix.deepCopy(A);
		
		for (var i = 0; i < 5; i++) {
			mulAB = matrix.multiple(A, B);
			A = mulAB;
		}
		
		x+=120;
		mathText.printMatrix(mulAB, x, y, 100);
		
	}</span>





<span style="font-size:18px;">	if (1) {
		var mathText = new MathText();		
		var matrix = new Matrix();
		
		var x = y = 20;
		
		//希腊字母表(存此用于Ctrl C/V
			//ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ
			//αβγδεζηθικλμνξοπρστυφχψω
		
		var rank = 2;
		
		var m1 = [['cosα', '-sinα'], ['sinα', ' cosa']];
		mathText.printMatrix(m1, x, y, 150);
		
		x += 180;
		var m2 = [[1, 0], [0, 1]];
		mathText.printMatrix(m2, x, y, 60);
		
		x += 80;
		m2 = [[1, 0], [0, -1]];
		mathText.printMatrix(m2, x, y, 80);
		
		x += 90;
		m2 = [[-1, 0], [0, 1]];
		mathText.printMatrix(m2, x, y, 80);
		
		x += 90;
		m2 = [[-1, 0], [0, -1]];
		mathText.printMatrix(m2, x, y, 80);
		
		x = 20;
		y+= 150;
		
		var m3 = [[1, 0], [0, 'k']];
		mathText.printMatrix(m3, x, y, 80);
		
		x += 90;
		m3 = [['k', 0], [0, 1]];
		mathText.printMatrix(m3, x, y, 80);
		
		x += 90;
		m3 = [['k_[1]', 0], [0, 'k_[2]']];
		mathText.printMatrix(m3, x, y, 80);
		
		
		x += 90;
		m3 = [[1, 0], ['k', 1]];
		mathText.printMatrix(m3, x, y, 80);
	
	
		var A = [[1,2], [3,4], [5,6], [7,8]];
		var B = [[1,2,3,4], [5,6,7,8]];
		
		var mulAB = matrix.multiple(A, B);
		
		x+=90;
		mathText.printMatrix(mulAB, x, y, 150);
		
		x = 20;
		y+= 150;
		
		A = [[-1, 0], [0, 1]];
		B = [[2], [2]];
		
		mulAB = matrix.multiple(A, B);
		mathText.printMatrix(mulAB, x, y, 40);
		
		x += 50;
		
		A = [[0.866, -0.5], [0.5, 0.866]];
		B = [[1, 2], [0, 1]];
		
		mulAB = matrix.multiple(A, B);
		mathText.printMatrix(mulAB, x, y, 150);
		
		x += 160;
		
		A = [[0.866, -0.5], [0.5, 0.866]];
		B = [[1], [0]];
		
		mulAB = matrix.multiple(A, B);
		mathText.printMatrix(mulAB, x, y, 70);
		
		x += 80;
		
		A = [[1, 2], [0, 1]];
		B = mulAB;
		
		mulAB = matrix.multiple(A, B);
		mathText.printMatrix(mulAB, x, y, 70);
		
		x += 80;
		A = [[0.866, -0.5], [0.5, 0.866]];
		B = [[1, 2], [0, 1]];
		mulAB = matrix.multiple(A, B);
		mathText.printMatrix(mulAB, x, y, 150);
	}</span>

<span style="font-size:18px;">	//矩阵书写,给一块区域的左上角坐标及范围宽度和高度
	//可以比较美观的写出矩阵
	this.printMatrix = function(matrix, leftUpPointX, leftUpPointY, regionWidth, regionHeight) {
		leftUpPointX = leftUpPointX ? leftUpPointX : 20;
		leftUpPointY = leftUpPointY ? leftUpPointY : 20;
		regionWidth = regionWidth ? regionWidth : 200;
		
		
		var row = matrix.length;
		var col = matrix[0].length;
		var gap = 10;
		regionHeight = regionHeight ? regionHeight : row*(20+gap);
		
		
		var cellWidth = regionWidth/col-gap;
		var cellHeight = regionHeight/row - gap;
		
		var x = leftUpPointX;
		var y = leftUpPointY;
		
		var s = '';
		
		plot.save()
			.beginPath()
			.moveTo(x, y)
			.lineTo(x, y+regionHeight)
			.moveTo(x+regionWidth, y)
			.lineTo(x+regionWidth, y+regionHeight)
			.closePath()
			.stroke()
			.restore();
			
		var style = 'black';
		var measure = 0;
		
		
		y += gap+15;
		
		
		var s1 = '';
		var len = 0;
		var count = 0;
				
				
		for (var i = 0; i < row; i++) {
			for (var j = 0; j < col; j++) {
				s = matrix[i][j].toString();
				
				len = s.length;
				s1 = '';
				count = 0;
				
				//由于字符串中植入了许多格式识别符,这里需要去除掉
				//才能比较准确的确定显示宽度
				for (var n = 0; n < len; n++) {
					if (s[n] == '_' || s[n] == '[' || s[n] == ']' || s[n] == '^') {
						count++;
					}
					else {
						s1 += s[n];
					}
				}
				
				measure = plot.measureText(s1);
				measure -= count/3*10;
				
				x += cellWidth;
				//右对齐
				this.print(s, x-measure*1.5, y, style);
				
				x += gap;
				
			}
			
			x = leftUpPointX;
			y += cellHeight+gap;
		}
	}</span>







<span style="font-size:18px;">	if (1) {
		var matrix = new Matrix();
		
		var d = matrix.delta([[3,1], [4, 2]]);
		document.write(d);
	}</span>

<span style="font-size:18px;">3.00 , 1.00 , 
4.00 , 2.00 , 
2
1.00 , 2.00 , 
3.00 , 4.00 , 
-2
1.00 , 0.00 , 
1.00 , 0.00 , 
0
5.00 , -3.00 , 
2.00 , -1.00 , 
1
1.00 , 0.00 , 
0.00 , -1.00 , 
-1
1.00 , 0.00 , 
0.00 , -1.00 , 
6.00 , -3.00 , 
-4.00 , 2.00 , 
0
0.00 , 
3.00 , 2.00 , 
1.00 , -1.00 , 
-5
0.20 , 0.40 , 
0.20 , -0.60 , 

	if (1) {
		var matrix = new Matrix();
		
		var d = matrix.delta([[3,1], [4, 2]]);
		matrix.print([[3,1], [4, 2]]);
		document.write(d+'<br/>');
		
		d = matrix.delta([[1, 2], [3, 4]]);
		matrix.print([[1, 2], [3, 4]]);
		document.write(d+'<br/>');
		
		d = matrix.delta([[1, 0], [1, 0]]);
		matrix.print([[1, 0], [1, 0]]);
		document.write(d+'<br/>');
		
		d = matrix.delta([[5, -3], [2, -1]]);
		matrix.print([[5, -3], [2, -1]]);
		document.write(d+'<br/>');
		
		var m = [[1, 0], [0, -1]];
		matrix.print([[1, 0], [0, -1]]);
		d = matrix.delta(m);
		document.write(d+'<br/>');
		
		var inv = matrix.invOfRank2(m);
		matrix.print(inv);
		
		m = [[6, -3], [-4, 2]];
		d = matrix.delta(m);
		matrix.print(m);
		document.write(d+'<br/>');		
		inv = matrix.invOfRank2(m);
		matrix.print(inv);
		
		m = [[3, 2], [1, -1]];
		d = matrix.delta(m);
		matrix.print(m);
		document.write(d+'<br/>');		
		inv = matrix.invOfRank2(m);
		matrix.print(inv);
		
		
	}</span>




<span style="font-size:18px;">-----原矩阵----
3.00 , 1.00 , 
4.00 , 2.00 , 
-----逆矩阵----
1.00 , -0.50 , 
-2.00 , 1.50 , 
-----解矩阵----
2.00 , 
-4.00 , 
----- ----
-----原矩阵----
1.00 , 2.00 , 
0.00 , 1.00 , 
-----逆矩阵----
1.00 , -2.00 , 
0.00 , 1.00 , 
-----解矩阵----
-1.00 , 
1.00 , 
----- ----
-----原矩阵----
0.71 , -0.71 , 
0.71 , 0.71 , 
-----逆矩阵----
0.71 , 0.71 , 
-0.71 , 0.71 , 
-----解矩阵----
0.00 , 
1.41 , 
----- ----
-----原矩阵----
5.00 , -3.00 , 
2.00 , -1.00 , 
-----逆矩阵----
-1.00 , 3.00 , 
-2.00 , 5.00 , 
-----解矩阵----
-7.00 , 
-12.00 , 
----- ----
-----原矩阵----
3.00 , 2.00 , 
1.00 , 1.00 , 
-----逆矩阵----
1.00 , -2.00 , 
-1.00 , 3.00 , 
-----解矩阵----
4.00 , 
-6.00 , 
----- ----
-----原矩阵----
3.00 , 1.00 , 
4.00 , 2.00 , 
-----逆矩阵----
1.00 , -0.50 , 
-2.00 , 1.50 , 
-----解矩阵----
0.50 , 
0.50 , 
----- ----

	if (1) {
		var matrix = new Matrix();
		
		//例
		var m = [[3, 1], [4, 2]];
		var v = [[2], [0]];
		var inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		var mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
		

		m = [[1, 2], [0, 1]];
		v = [[1], [1]];
		inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
		
		m = [[0.707, -0.707], [0.707, 0.707]];
		v = [[-1], [1]];
		inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
		
		m = [[5, -3], [2, -1]];
		v = [[1], [-2]];
		inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
		
				m = [[3, 2], [1, 1]];
		v = [[0], [-2]];
		inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
		
						m = [[3, 1], [4, 2]];
		v = [[2], [3]];
		inv = matrix.invOfRank2(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----逆矩阵----'+'<br/>');
		matrix.print(inv);
		document.write('-----解矩阵----'+'<br/>');
		mul = matrix.multiple(inv, v);
		matrix.print(mul);
		document.write('----- ----'+'<br/>');
	}</span>







<span style="font-size:18px;">	if (1) {
		var matrix = new Matrix();
		
		//例
		var m = [[1, 2], [-1, 4]];
		var eigen = matrix.eigenvalue(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----特征矩阵----'+'<br/>');
		matrix.print(eigen);

	}
	
-----原矩阵----
8.00 , -5.00 , 
6.00 , -3.00 , 
-----特征矩阵----
2.00 , 3.00 , 
1.00 , 1.20 , 
1.00 , 1.00 , </span>




<span style="font-size:18px;">-----原矩阵----
0.99 , 0.05 , 
0.01 , 0.95 , 
-----特征矩阵----
0.94 , 1.00 , 
1.00 , -1.00 , 
5.00 , 1.00 , 

	if (1) {
		var matrix = new Matrix();
		
		var m = [[0.99,0.05],[0.01,0.95]];		
		
		var eigen = matrix.eigenvalue(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----特征矩阵----'+'<br/>');
		matrix.print(eigen);
	}
	</span>



<span style="font-size:18px;">[5, 6], [1, 1]

6.00 , 
7.00 , 
----- ----
13.00 , 
15.00 , 
----- ----
29.00 , 
33.00 , 
----- ----
67.00 , 
75.00 , 
----- ----
161.00 , 
177.00 , 
----- ----
403.00 , 
435.00 , 

	if (1) {
		var matrix = new Matrix();
		
		//习题4.2 -- 1
		var m = [[8, -5], [6, -3]];
		var v = [[6], [7]];
		
		/*
		var eigen = matrix.eigenvalue(m);
		document.write('-----原矩阵----'+'<br/>');
		matrix.print(m);
		document.write('-----特征矩阵----'+'<br/>');
		matrix.print(eigen);
		*/
		
		matrix.print(v);
		var mulAB = matrix.multiple(m, v);
		
		for (var i = 0; i < 5; i++) {
			document.write('----- ----'+'<br/>');
			matrix.print(mulAB);
			
			v = mulAB;
			mulAB = matrix.multiple(m, v);
		}

	}</span>

<span style="font-size:18px;">def fun(n):
    A = [2**n*5+3**n, 2**n*6+3**n];
    print(A);
    
def tmp():
    fun(5);
    fun(100);
</span>

矩阵类:

<span style="font-size:18px;">/**
* @usage   矩阵类
* @author  mw
* @date    2016年03月24日  星期四  14:51:45 
* @param
* @return
*
*/
function Matrix() {
	this.delta = function(matrix) {
		var size = matrix.length;
		
		if (!matrix[0].length) {
			return 0;
		}
		else {
			if (matrix[0].length != size) {
				return 0;
			}
			
			if (size < 1) {
				return 0;
			}
			else if (size == 1) {
				return matrix[0][0];
			}
			else {
				var d = 0;
				var subMatrix = [];
				
				for (var i = 0; i < size; i++) {
					subMatrix = this.subSet(matrix, i, 0);
					d += Math.pow(-1, i)*matrix[i][0]*this.delta(subMatrix);
				}
				return d;
			}
		}
	}
	
	this.subSet = function(matrix, row, col) {	
		var size = matrix.length;
		
		if (!matrix[0].length) {
			return [];
		}
		else {
			if (matrix[0].length != size) {
				return [];
			}
			
			var newMatrix = new Array();
			var rowArray= new Array();
			
			for (var i = 0; i < size; i++) {
				if (i == row) {
					continue;
				}
				else {
					rowArray = [];
				
					for (var j = 0; j < size; j++) {
						if (j == col) {
							continue;
						}
						else {
							rowArray.push(matrix[i][j]);
						}
					}
					
					newMatrix.push(rowArray)
				}
			}
			
			return newMatrix;
		}
	}
	
	this.identityMatrix = function(rank) {
		var newMatrix = new Array();
		var rowArray= new Array();
		
		for (var i = 0; i < rank; i++) {
			rowArray = [];
			
			for (var j = 0; j < rank; j++) {
				if (j == i) {
					rowArray.push(1);
				}
				else {
					rowArray.push(0);
				}
			}
			
			newMatrix.push(rowArray);
		}
		
		return newMatrix;
	}
	
	//建立row*col空矩阵
	this.zeroMatrix = function(row, col) {

		var newMatrix = new Array();
		var rowArray= new Array();
		
		for (var i = 0; i < row; i++) {
			rowArray = [];
			
			for (var j = 0; j < col; j++) {
				rowArray.push(0);
			}
			
			newMatrix.push(rowArray);
		}
		
		return newMatrix;
	}
	
	//把从1-n的n个数按顺序放到矩阵中
	this.sequenceMatrix = function(rank) {
		var newMatrix = new Array();
		var rowArray= new Array();
		
		var count = 0;
		for (var i = 0; i < rank; i++) {
			rowArray = [];
			
			for (var j = 0; j < rank; j++) {
				count++;
				rowArray.push(count);
				
			}
			
			newMatrix.push(rowArray);
		}
		
		return newMatrix;
	}
	
	
	this.print = function(matrix) {
		var size = matrix.length;
		
		if (!matrix[0].length) {
			return [];
		}
		else {
			var rSize = matrix[0].length;
			
			var s = '';
			
			for (var i = 0; i < size; i++) {
				s = '';
				
				for (var j = 0; j < rSize; j++) {
					s += matrix[i][j].toFixed(2) + ' , ';
				}
				
				document.write(s+'<br/>');
			}
		}
	}
					
	this.deepCopy = function(matrix) {
		var size = matrix.length;
		
		if (!matrix[0].length) {
			return [];
		}
		else {
			var rSize = matrix[0].length;
			
			var newMatrix = new Array();
			var rowArray= new Array();
			
			for (var i = 0; i < size; i++) {
				rowArray = [];
				
				for (var j = 0; j < rSize; j++) {
					rowArray.push(matrix[i][j]);
				}
				newMatrix.push(rowArray);
			}
			return newMatrix;
		}
	}
	
/**
* @usage   矩阵的乘法
* @author  mw
* @date    2016年05月02日  星期一  10:44:46 
* @param
* @return
*
*/
	
	this.multiple = function(Matrix1, Matrix2) {
		var row1 = Matrix1.length;
		var col1 = Matrix1[0].length;
		
		
		
		var row2 = Matrix2.length;
		var col2 = Matrix2[0].length;

		var A = [row1, col1, row2, col2];
		
		
		if (col1 != row2) {
			return this.zeroMatrix(row1, col2);
		}
		
		var mulResult = this.zeroMatrix(row1, col2);

		

			for (var i = 0; i < row1; i++) {
				for (var j = 0; j < col2; j++) {
					for (var k = 0; k < row2; k++) {
						mulResult[i][j] += Matrix1[i][k]*Matrix2[k][j];
					}
				}
			}

		
		return mulResult;
		
	}
	
	//二阶矩阵的逆
	this.invOfRank2 = function(Matrix) {
		var d = this.delta(Matrix);
		
		
		if (d != 0) {
			return [[Matrix[1][1]/d, -Matrix[0][1]/d], [-Matrix[1][0]/d, Matrix[0][0]/d]];
		}
		
		else {
			return this.zeroMatrix(2, 2);
		}
		
	}
	
	//二阶矩阵的特征值
	this.eigenvalue = function(Matrix) {
		var a = Matrix[0][0];
		var b = Matrix[0][1];
		var c = Matrix[1][0];
		var d = Matrix[1][1];
		
		var judge = (a+d)*(a+d)-4*(a*d-b*c);
		if ( judge >= 0) {
			var lambda_1 = 0.5*((a+d)-Math.sqrt(judge));
			var lambda_2 = 0.5*((a+d)+Math.sqrt(judge));
		}
		
		
		//特征向量有很多组,这里随便取一组
		//特征值放在第一行,然后是每个特征值对应的一个特征向量
		if (b != 0) {
			return [[lambda_1, lambda_2], [1, (lambda_1-a)/b], [b/(lambda_2-a), 1]];
		}
		else if (c != 0) {
			return [[lambda_1, lambda_2], [1, c/(lambda_1-d)], [(lambda_2-d)/c, 1]];
		}
		
	
	}
	
}</span>

本节到此结束,欲知后事如何,请看下回分解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值