Где-то так...
Для контроля производится умножение матриц...
Увеличивая размерность матриц, существенно увеличивается время
При N=9 считает 2 сек
При N=10 считает 12 сек
При N=11 считает 145 сек
Времена заданы для дебаговской версии. Релиз не пробовал...
Вот пусть компиляторы и оптимизируют программку
PS Обратная матрица находится с помощью союзной матрицы...
[code h=200]
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define N 10
#define SIGN(i,j) (1-(((i+j)&1)<<1))
void Print(double *A, int max)
{
int i, j;
for(i=0; i<max; i++)
{
for(j=0; j<max; j++)
printf("%8.4f ",A[i*max+j]);
printf("\n");
}
printf("\n");
}
void FillArray(double *A, double *array, int max, int i, int j)
{
int iA,jA,iB,jB;
for(iA=iB=0; iA<max; iA++)
{
if (iA != i)
{
for(jA=jB=0; jA<max; jA++)
{
if (jA != j)
array[iB*(max-1)+jB++] = A[iA*max+jA];
}
iB++;
}
}
}
double GetDet(double *A, int max)
{
double det;
int j;
double *array;
if(max==1)
det = A[0];
else if(max==2)
det = A[0]*A[3]-A[1]*A[2];
else
{
det = 0;
array = (double*)malloc((max-1)*(max-1)*(sizeof(double)));
for(j=0; j<max; j++)
{
FillArray(A, array, max, 0, j);
det += SIGN(0,j)*A[j]*GetDet(array, max-1);
}
free(array);
}
return det;
}
bool ReverseArray(double *A, double *B, int max)
{
int i, j;
double det = GetDet(A, max);
double *array=NULL;
if (det == 0)
return false;
array = (double*)malloc((max-1)*(max-1)*(sizeof(double)));
for(i=0; i<max; i++)
{
for(j=0; j<max; j++)
{
FillArray(A, array, max, i, j);
B[j*max+i] = SIGN(i,j)*GetDet(array, max-1)/det;
}
}
free(array);
return true;
}
void MulArrays(double *A, double *B, double *C,int max)
{
int i, j, k;
double sum;
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
for(sum=k=0; k< max; k++)
sum += A[i*max+k]*B[k*max+j];
C[i*max+j] = sum;
}
}
}
int main()
{
int i, j;
srand(time(NULL));
double *A = (double*)malloc(N*N*sizeof(double));
double *B = (double*)malloc(N*N*sizeof(double));
double *C = (double*)malloc(N*N*sizeof(double));
for(i=0; i<N; i++)
for(j=0; j<N; j++)
A[i*N+j] = ((double)((rand() % 2000) - 1000))/17;
Print(A, N);
if (ReverseArray(A, B, N))
{
Print(B, N);
MulArrays(A, B, C, N);
Print(C, N);
}
else
printf("Singular array!\n");
_getch();
free(A);
free(B);
free(C);
return 0;
}[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен