求逆矩陣C++
運用二維數組對線性代數中的矩陣求逆
- 算法: Guss_Jordan法
- vs17
- 矩陣為滿秩矩陣
- 主函數中修改矩陣,行數,列數
void Guss_Jordan(double a[], int n)
{
int *H, *L, i, j, k, m, u, v;
double d, q;
double p;
H = new int[n];
L = new int[n];
for (k = 0; k <= n - 1; k++)
{
d = 0.0;
for (i = k; i <= n - 1; i++)
for (j = k; j <= n - 1; j++)
{
m = i * n + j;
q = jdz(a[m]);
if (q > d) { d = q; H[k] = i; L[k] = j; }
}
if (H[k] != k)
for (j = 0; j <= n - 1; j++)
{
u = k * n + j; v = H[k] * n + j;
p = a[u]; a[u] = a[v]; a[v] = p;
}
if (L[k] != k)
for (i = 0; i <= n - 1; i++)
{
u = i * n + k; v = i * n + L[k];
p = a[u]; a[u] = a[v]; a[v] = p;
}
m = k * n + k;
a[m] = f(a[m]);
for (j = 0; j <= n - 1; j++)
if (j != k)
{
u = k * n + j; a[u] = a[u] * a[m];
}
for (i = 0; i <= n - 1; i++)
if (i != k)
for (j = 0; j <= n - 1; j++)
if (j != k)
{
u = i * n + j;
a[u] = a[u] - a[i*n + k] * a[k*n + j];
}
for (i = 0; i <= n - 1; i++)
if (i != k)
{
u = i * n + k; a[u] = (a[u] - a[u] - a[u])*a[m];
}
}
for (k = n - 1; k >= 0; k--)
{
if (L[k] != k)
for (j = 0; j <= n - 1; j++)
{
u = k * n + j; v = L[k] * n + j;
p = a[u]; a[u] = a[v]; a[v] = p;
}
if (H[k] != k)
for (i = 0; i <= n - 1; i++)
{
u = i * n + k; v = i * n + H[k];
p = a[u]; a[u] = a[v]; a[v] = p;
}
}
delete[] H; delete[] L;
}
主函數中對Guss_Jordan函數的調用:
#define N n(行數,列數)
for (i=0; i<N; i++)
for (j=0; j<N; j++)
b[i][j]=a[i][j];
Guss_Jordan(&b[0][0],N); //調用Guss_Jordan函數
{
cout <<"逆矩陣:" <<endl;;
for (i=0; i<N; i++)
{
for (j = 0; j <N; j++)
{
cout << b[i][j] << " ";
}
cout << endl;
}
}
上述代碼在vs17環境下編譯運作通過。
我的GitHub連結https://github.com/TYduoduo