剧情提要:
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第七转的修炼。
这次要研究的是[矩阵与变换]。
![](https://img-blog.csdn.net/20160502133409510)
![](https://img-blog.csdn.net/20160502133512293)
![](https://img-blog.csdn.net/20160502133726796)
![](https://img-blog.csdn.net/20160502133829423)
![](https://img-blog.csdn.net/20160502134033317)
矩阵类:
本节到此结束,欲知后事如何,请看下回分解。
[机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第七转的修炼。
这次要研究的是[矩阵与变换]。
正剧开始:
星历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>
本节到此结束,欲知后事如何,请看下回分解。