public static double[,] Inverse(double [,] Array)
{
int m = 0;
int n = 0;
m = Array.GetLength(0);
n = Array.GetLength(1);
double[,] array = new double[2*m+1, 2*n+1];
for (int k = 0; k < 2*m+1; k++) //初始化數組
{
for (int t = 0; t < 2*n+1; t++)
{
array[k, t] = 0.00000000;
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
array[i, j] = Array[i, j];
}
}
for (int k = 0; k < m; k++)
{
for (int t = n; t <= 2*n; t++)
{
if ((t - k) == m)
{
array[k, t] = 1.0;
}
else
{
array[k, t] = 0;
}
}
}
//得到逆矩陣
for (int k = 0; k < m; k++)
{
if (array[k, k] != 1)
{
double bs = array[k, k];
array[k, k] = 1;
for (int p = k + 1; p < 2*n; p++)
{
array[k, p] /= bs;
}
}
for (int q = 0; q < m; q++)
{
if (q != k)
{
double bs = array[q, k];
for (int p = 0; p < 2*n; p++)
{
array[q, p] -= bs * array[k, p];
}
}
else
{
continue;
}
}
}
double [,] NI = new double[m, n];
for (int x = 0; x < m; x++)
{
for (int y = n; y < 2*n; y++)
{
NI[x, y - n] = array[x, y];
}
}
return NI;
}
測試代碼:
static void Main(string[] args)
{
double[,] a = new double[3, 3] { { 1, 2, 3 }, { 2, 2, 1 }, { 3, 4, 3 } };//測試數組
double [,] dReturn = Inverse(a);
for (int i = 0; i < a.GetLength(0);i++ )
{
for (int j = 0; j < a.GetLength(1); j++)
{
Console.Write(dReturn[i,j]+ "\t ");
}
Console.WriteLine();
}
Console.ReadKey();
}
測試結果展示: