📄 matrix_calculate.js
字号:
function Matrix(Row,Line)
{
this.Row = Row;
this.Line = Line;
this.Elem = new Array;
for(var i = 0; i < Row;i++ )
{
this.Elem[i] = new Array;
for(var j = 0; j < Line; j++)
{
this.Elem[i][j] = new Fraction(0,1);
}
}
//this.Rank;
}
function M_Add(matrix1,matrix2)
{
var r;
if(matrix1.Row != matrix2.Row || matrix1.Line != matrix2.Line)
{
alert("matrixes\' lines or rows are not equal can\'t add!\n矩阵不等不能加!");
r =new Matrix(0,0);
}
else
{
r = new Matrix(matrix1.Row,matrix1.Line);
for (var i = 0; i< r.Row; i++)
{
for(var j = 0; j < r.Line; j++)
{
r.Elem[i][j] = F_Add(matrix1.Elem[i][j],matrix2.Elem[i][j]);
}
}
}
return r;
}
function M_C_Multiply(fraction,matrix)
{
var r = new Matrix(matrix.Row,matrix.Line);
for (var i = 0; i< r.Row; i++)
for(var j = 0; j < r.Line; j++)
r.Elem[i][j] = F_Multiply(fraction,matrix.Elem[i][j]);
return r;
}
function M_M_Multiply(matrix1,matrix2)
{
var r;
if(matrix1.Line != matrix2.Row)
{
alert("this two matrixes can not Multiply!\n这两个矩阵不能相乘!");
r =new Matrix(0,0);
}
else
{
r = new Matrix(matrix1.Row,matrix2.Line);
for(var i = 0; i < r.Row; i++)
{
for(var j = 0; j < r.Line; j++)
{
for(var k = 0; k < matrix1.Line; k++)
r.Elem[i][j] =F_Add(r.Elem[i][j],F_Multiply(matrix1.Elem[i][k],matrix2.Elem[k][j]));
}
}
}
return r;
}
function M_Det(sq_matrix)
{
var o = new Fraction(0,1);//定义0分数不要改变它的值!
if(sq_matrix.Row != sq_matrix.Line)
{
alert("it\'s not a square matrix !it dosen\'t have det!\n 不是方阵不能算行列式");
return new Fraction("error",1);
}
else
{
var r = new Fraction(1,1);
var temp = sq_matrix;
for(var n = temp.Row;n > 0; n--)
{
if(F_Equal(o,temp.Elem[n-1][n-1]))//注意这里o是分数的0;不能用0代替! { var helper = new Fraction(0,1); for(var ii=n-2;ii!=-1&& F_Equal(o,temp.Elem[n-1][ii]);ii--);//注意这里o是分数的0;不能用0代替! if(-1==ii)
return o; else { for(var iii=0;iii<n;iii++) { helper = F_Minus(o,temp.Elem[iii][ii]); temp.Elem[iii][ii] = temp.Elem[iii][n-1]; temp.Elem[iii][n-1] = helper; } }
}
for(var i=0;i<n-1;i++) for(var j=0;j<n-1;j++) temp.Elem[i][j] = F_Minus(temp.Elem[i][j],F_Multiply(temp.Elem[n-1][j],F_Divide(temp.Elem[i][n-1],temp.Elem[n-1][n-1]))); r = F_Multiply(r,temp.Elem[n-1][n-1]);
}
return r ;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function M_Re(sq_matrix)
{
var o = new Fraction(0,1);//定义0分数不要改变它的值!
var r;
if(sq_matrix.Row != sq_matrix.Line)
{
alert("it\'s not a square matrix !\n 不是方阵不能求逆!");
r = new Matrix(0,0);
}
else
{
var temp = new Matrix(sq_matrix.Row,sq_matrix.Line);
r = new Matrix(sq_matrix.Row,sq_matrix.Line);
temp = sq_matrix;
for(var i = 0;i < r.Row;i++)//////
for(var j = 0; j < r.Line ; j++)
if(i == j) r.Elem[i][j].N = 1;
for(var i = 0;i < temp.Row; i++)
{
if(F_Equal(temp.Elem[i][i],o) )//注意这里o是分数的0;不能用0代替!
{ var j = i+1;
for(j = i+1;j < temp.Row && F_Equal(o,temp.Elem[j][i]);j++);//注意这里o是分数的0;不能用0代替!
if(j == temp.Row)
{
alert("行列式为0不能计算逆矩阵!");
re = new Matrix(0,0);
return re;
}
else
{
temp = M_Eij(temp,i,j);
r = M_Eij(r,i,j);
}
}
for(var l = i+1;l < temp.Row;l++)
{
var c = F_Minus(o,F_Divide(temp.Elem[l][i],temp.Elem[i][i]));
temp = M_Eijc(temp,i,l,c);
r = M_Eijc(r,i,l,c);
}
}
for(var i = temp.Row-1;i >= 0;i--)
{
for(var l = i-1;l >= 0;l--)
{
var c = F_Minus(o,F_Divide(temp.Elem[l][i],temp.Elem[i][i]));
temp = M_Eijc(temp,i,l,c);
r = M_Eijc(r,i,l,c);
}
}
for(var i = 0;i < temp.Row; i++)
{
var I = new Fraction(1,1);
var c = F_Divide(I,temp.Elem[i][i]);
temp = M_Eic(temp,i,c);
r = M_Eic(r,i,c);
}
}
return r ;
}
//////////////////////////////////////////////////////////////////////
function M_Simple(matrix)
{
var string = "";
var o = new Fraction(0,1);//定义0分数不要改变它的值!
var r;
for(var i = 0;i < matrix.Row;i++)
{
var j;
for(j = i;j < matrix.Line && F_Equal(o,matrix.Elem[i][j]);j++)
{
var k;
for(k = i+1;k < matrix.Row&&F_Equal(o,matrix.Elem[k][j]);k++);
if(k != matrix.Row)
{
matrix = M_Eij(matrix,k,i);
string += "E"+(k+1)+","+(i+1)+"<br>"+Matrix_To_HTML(matrix);
j--;
}
}
if(j != matrix.Line )
for(var k = i+1;k < matrix.Row;k++)
{
var c = F_Minus(o,F_Divide(matrix.Elem[k][j],matrix.Elem[i][j]));
matrix = M_Eijc(matrix,i,k,c);
string += "E"+(i+1)+","+(k+1)+","+(c.N/c.D)+"<br>"+Matrix_To_HTML(matrix);
}
}
for(var i = matrix.Row-1;i >= 0;i--)
{
for(var j = 0;j < matrix.Line&& F_Equal(o,matrix.Elem[i][j]);j++);
if(j != matrix.Line)
{
for(var k = i-1;k >= 0;k--)
{
var c = F_Minus(o,F_Divide(matrix.Elem[k][j],matrix.Elem[i][j]));
matrix = M_Eijc(matrix,i,k,c);
string += "E"+(i+1)+","+(k+1)+","+(c.N/c.D)+"<br>"+Matrix_To_HTML(matrix);
}
}
}
for(var i = matrix.Row-1;i >= 0;i--)
{
for(var j = 0;j < matrix.Line&& F_Equal(o,matrix.Elem[i][j]);j++);
if(j != matrix.Line)
{
var I = new Fraction(1,1);
var c = F_Divide(I,matrix.Elem[i][j]);
matrix = M_Eic(matrix,i,c);
string += "E"+(i+1)+","+(c.N/c.D)+"<br>"+Matrix_To_HTML(matrix);
}
}
return string;
}
//////////////////////////////////////////////////////////////////////
function M_Eic(matrix,i,c)
{
for(var j = 0;j < matrix.Line;j++)
matrix.Elem[i][j] = F_Multiply(matrix.Elem[i][j],c);
return matrix;
}
function M_Eijc(matrix,i,j,c)//matrix的i行乘以c加到第j行!
{
for(var k = 0; k < matrix.Line;k++)
matrix.Elem[j][k] = F_Add(matrix.Elem[j][k],F_Multiply(matrix.Elem[i][k],c));
return matrix;
}
function M_Eij(matrix,i,j)
{
var h = new Fraction(0,1);
for(var k = 0;k < matrix.Line;k++)
{
h = matrix.Elem[i][k];
matrix.Elem[i][k] = matrix.Elem[j][k];
matrix.Elem[j][k] = h;
}
return matrix;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function To_Matrix(s)///s must like this s = "1/1,2/1,3/1;4/1,5/1,6/1;7/1,8/1,9/1end";
{
s = s.split("end");
if(s.length < 2)
{ alert("please end the matrix with \"end\"\n矩阵请以end结尾!"); return new Matrix(0,0);}
s = s[0];
var matrix_arr = s.split(";");
for(var i = 0;i < matrix_arr.length;i++)
matrix_arr[i] = matrix_arr[i].split(",");
for(var i = 0;i < matrix_arr.length;i++)
{
if(matrix_arr[i].length == matrix_arr[0].length)
{
for(var j = 0;j < matrix_arr[0].length;j++)
matrix_arr[i][j] = matrix_arr[i][j].split("/");
}
else
{
alert("输入错误可能是每一行的元素个数不同!");
return new Matrix(0,0);
}
}
var r = new Matrix(matrix_arr.length,matrix_arr[0].length);
for(var i = 0;i < r.Row; i++)
for(var j = 0;j < r.Line;j++)
{
r.Elem[i][j].N = parseFloat(matrix_arr[i][j][0]);
if(matrix_arr[i][j].length == 2)
r.Elem[i][j].D = parseFloat(matrix_arr[i][j][1]);
}
return r;
}
function Matrix_To_S(matrix)
{
var s = "";
for(var i = 0;i < matrix.Row;i++)
{
for(var j = 0;j < matrix.Line; j++)
{
s += matrix.Elem[i][j].N+"/"+matrix.Elem[i][j].D;
if(j!=matrix.Line-1)s += ",\t"
}
if(i != matrix.Row-1) s += ";\t\n";
}
s += "end\n";
s += "equals to :\n";
for(var i = 0;i < matrix.Row;i++)
{
for(var j = 0;j < matrix.Line; j++)
{
s += (matrix.Elem[i][j].N/matrix.Elem[i][j].D);
if(j!=matrix.Line-1)s += ",\t"
}
if(i != matrix.Row-1) s += ";\t\n";
}
s += "end\n";
return s;
}
//////////////////////////////////////////////////////////////
function S_To_Norm(s,N)
{
if(s.length < N)
for(var i = s.length;i <= N;i++)
s += " ";
return s;
}
function Matrix_To_HTML(matrix)
{
var s = "<font color = \"green\">Resrlt:<br>";
for(var i = 0;i < matrix.Row;i++)
{
for(var j = 0;j < matrix.Line; j++)
{
var ss = ""+matrix.Elem[i][j].N+"</font><font color=\"red\">/</font><font color = \"green\">"+matrix.Elem[i][j].D;
s += S_To_Norm(ss,83);
if(j!=matrix.Line-1)s += "</font><font color=\"red\">,</font><font color = \"green\">"
}
if(i != matrix.Row-1) s += "</font><font color=\"red\">;</font><font color = \"green\"><br>";
}
s += "</font><font color=\"red\">end</font><font color = \"green\"><br>";
/* s += "equals to :<br>";
for(var i = 0;i < matrix.Row;i++)
{
for(var j = 0;j < matrix.Line; j++)
{
ss = ""+(Math.round(matrix.Elem[i][j].N/matrix.Elem[i][j].D*1000000)/1000000);
s += S_To_Norm(ss,22);
if(j!=matrix.Line-1)s += "</font><font color=\"red\">,</font><font color = \"green\">"
}
if(i != matrix.Row-1) s += "</font><font color=\"red\">;</font><font color = \"green\"><br>";
}
s += "</font><font color=\"red\">end</font><br></font>";*/
return s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -