logo search
ООП для Заоч / Пинчук Лозовская Программир на С

Void ObrMatr (double** a, double** b, unsigned n )

{ int i, j, k=0, N2=N*2;

double D, R;

double** C = new double*[N]; // створення робочої матриці С

for (int i=0; i<N; i++) C[i] = new double[N2];

for (i=0; i<N; i++)

{ for (j=0; j<N; j++) { C[i][j]=A[i][j]; C[i][N+j]=0; }

C[i][i+N] = 1;

}

// зведення до нуля елементів підматриці А нижче головної // діагоналі

for (i=0; i<N-1; i++)

{ D=fabs(C[i][i]);

k=i;

for (j=i+1; j<N; j++)

if (fabs(C[j][i])>D) { k=j; D=fabs(C[j][i]); }

if (k!=i) swp(C[k],C[i]); // вибір головного елемента

R = 1./C[i][i];

for (k=i+1; k<N; k++)

{ D = C[k][i]*R;

for (j=i; j<N2; j++) C[k][j] = C[k][j]- D*C[i][j];

}

}

// зведення до нуля елементів подматриці А вище головної // діагоналі

for (i=0; i<N; i++)

{ D = C[i][i];

for (j=0; j<N2; j++) C[i][j]=C[i][j]/D;

}

for (i=1; i<N; i++)

for (k=0; k<i; k++)

{ D= C[k][i];

for (j=i; j<N2; j++) C[k][j]=C[k][j]-C[i][j]*D;

}

// вибір елементів оберненої матриці B

for (i=0; i<N; i++) for (j=0; j<N; j++) B[i][j] = C[i][j+N];

for (i=0; i<N; i++) delete[] C[i]; // звільнення пам'яті

delete[] C;

}

Нижче наведено ще одну функцію для обернення матриці, яка реалізує так званий метод заміщення за схемою Гауса. Параметри функції: A - матриця, що надана, B - обернена матриця, N - розмір матриць А,В. Як і раніше, двовимірний масив B відповідних розмірів повинен бути створений заздалегідь. Метод заміщення є більш економним по відношенню до ресурсів пам’яті, але застосування вибору головного елемента у цьому разі неможливе.

// Приклад 5