⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix_calculate.js

📁 矩阵计算
💻 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 += "&nbsp;";
	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 + -