static double [,] MatrixInverse(double[,] matrixIn)
{
//二维矩阵求逆
//该方法为:采用全选主元高斯-约当(gauss-jordan)消去法;算法描述:《常用算法程序集(C语言描述)》(第三版) 徐士良 清华大学出版
//该书40页,具体方法为一般实矩阵求逆
//该函数没有判断该矩阵是否可逆,(如果不可逆,原样输出),该函数判断了是否为方阵,(非方阵,原样输出)
//program by c#
//by
//last modify 2010-1-25
int n = matrixIn.GetLength(0);//获得矩阵大小,行数
int m = matrixIn.GetLength(1);//获得矩阵列数
double[,] matrix=new double[n,m];
for (int i = 0; i <= n - 1;i++ )
{
for (int j = 0; j <= m - 1;j++ )
{
matrix[i,j]=matrixIn[i,j];
}
}
if (n!=m)
{
//输入矩阵不为方阵
//Console.WriteLine("input matrix have problem!");
goto endResult;
}
double temp=0.0;
double maxValue=0.0;
int [] iz =new int[n];
int[] jz = new int[n];
int k;
for (k = 0; k <= n - 1;k++ )
{
maxValue = 0.0;
for (int i = k; i <= n - 1;i++ )
{
for (int j=k;j<=n-1;j++)
{
double value = Math.Abs(matrix[i, j]);
if (value>maxValue)
{
maxValue = value;
iz[k] = i;
jz[k] = j;
}
}
}
if (maxValue+1.0==1.0)
{
// Console.WriteLine("NOT FIND MAX VALUE!");
}
if (iz[k]!=k)
{
//行交换
for (int i = 0; i <= n - 1;i++ )
{
temp=matrix[k,i];
matrix[k,i]=matrix[iz[k],i];
matrix[iz[k], i] = temp;
}
}
if (jz[k]!=k)
{
//列交互
for (int j = 0; j <= n - 1;j++ )
{
temp=matrix[j,k];
matrix[j,k]=matrix[j,jz[k]];
matrix[j, jz[k]] = temp;
}
}
//归一化
matrix[k,k]=1.0/matrix[k,k];
for (int j = 0; j <= n - 1;j++ )
{
if (j!=k)
{
matrix[k,j]=matrix[k,j]*matrix[k,k];
}
}
//消元计算
for (int i = 0; i <= n - 1;i++ )
{
if (i!=k)
{
for (int j = 0; j <= n - 1;j++ )
{
if (j!=k)
{
matrix[i,j]=matrix[i,j]-matrix[i,k]*matrix[k,j];
}
}
}
}
for (int i = 0; i <= n - 1;i++ )
{
if (i!=k)
{
matrix[i,k]=-matrix[i,k]*matrix[k,k];
}
}
}
for (k = n - 1; k >= 0;k-- )
{
if (jz[k]!=k)
{
for (int j = 0; j <= n - 1;j++ )
{
temp=matrix[k,j];
matrix[k,j]=matrix[jz[k],j];
matrix[jz[k], j] = temp;
}
}
if (iz[k]!=k)
{
for (int i = 0; i <= n - 1;i++ )
{
temp=matrix[i,k];
matrix[i,k]=matrix[i,iz[k]];
matrix[i, iz[k]] = temp;
}
}
}
endResult:
return matrix;
}