Rozwinięcie Laplace'a - Problem z alokacją pamięci

dpiotrow
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 7 cze 2009, o 13:59
Płeć: Kobieta
Podziękował: 4 razy

Rozwinięcie Laplace'a - Problem z alokacją pamięci

Post autor: dpiotrow »

Mam kod liczacy (prawdopodobnie) wyznacznik metodą laplace'a. Jest jeden problem, a mianowicie związany z alokacją pamięci. Czy ktoś mógłby mi pomóc?

Kod: Zaznacz cały

#include<stdio.h>
#include<math.h>
int M[1000][1000];
main()
{
        int i, j, n, max,zm;
        double wyznacznik;
printf("podaj wymiar macierzy kwadratowej:\n", n);
scanf("%d", &n);
for (i=0; i<n; i++)
{
        for( j=0; j<n;j++)
        {
        printf("podaj M[%d][%d]\n", i, j);
        scanf("%d", &M[i][j]);
        }
}

if (n==2)
{       wyznacznik=M[0][0]*M[1][1]-M[0][1]*M[1][0];
        printf("wyznacznik macierzy 2x2 wynosi: %f\n", wyznacznik);
}

else if(n>2)
{
        max=M[0][0];
        for(j=0;j<n;j++)
                {if (M[0][j]>max) max=M[0][j];}

for (i=0; i<n; i++)
{max=M[i][j];
zm= M[i][0];
M[i][0]=M[i][j];
M[i][j]=zm;
}

for( i=1; i<n; i++){
   for (j=0; j<n; j++){
       M[i][j]=M[i][j]-((M[i][0]/M[0][0])*M[0][j]);
}
}
}
system("pause");
}
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6908
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

Rozwinięcie Laplace'a - Problem z alokacją pamięci

Post autor: Mariusz M »

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

/*
Obliczanie wyznacznika metodą rozwinięć Laplace
*/

double det(double**, int);

int main(){
int i,j,n;
double** a;
char ch;
do{
printf("Podaj n=");
scanf("%d",&n);
a=(double**)malloc((n+1)*sizeof(double));
for(i=0;i<n+1;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      printf("A[%d][%d]=",i+1,j+1);
      scanf("%lf",&a[i][j]);
    }
printf("\n");
}
printf("det(A)=%lf\n",det(a,n));
for(i=0;i<n+1;i++)
free(a[i]);
free(a);
ch=getch();
}
while(ch!=27);
return 0;
}

double det(double** a, int size)
{
	int i, k, l, z = 1;
	double** b;
	double d = 0;
	b=(double**)malloc((size+1)*sizeof(double));
	for(i=0;i<size+1;i++)
	b[i]=(double*)malloc((size+1)*sizeof(double));
	if (size == 1)
		d = a[0][0];
	else
	{
		// rozwiniecie Laplace'a względem pierwszego wiersza
		for (i = 0; i < size; i++)
		{
			// przepisywanie wierszy
			for (k = 0; k < size - 1; k++)
			{
				// przepisywanie kolumn
		    	for (l = 0; l < size - 1; l++)
				{
						// przepisanie komórki znajdującej się w tej
						// samej kolumnie lecz w wierszu poniżej
					if (l < i)  b[k][l] = a[k + 1][l];
						// przepisanie komórki znajdującej się
						// w następnej kolumnie i wierszu poniżej
					else  b[k][l]=a[k + 1][l + 1];
				}
			}
			// wywołanie rekurencyjne
			d = d + z * a[0][i] * det(b, size-1);
			// zmiana znaku
			z = -z;
		}
	}
	for(i=0;i<size+1;i++)
	free(b[i]);
	free(b);
	return d;
}
W C alokacja pamięci powinna wyglądać mniej więcej tak
dpiotrow
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 7 cze 2009, o 13:59
Płeć: Kobieta
Podziękował: 4 razy

Rozwinięcie Laplace'a - Problem z alokacją pamięci

Post autor: dpiotrow »

Dziękuję bardzo, ale teraz mam problem z tym, żeby do tego dodać odwracanie macierzy. Czy mógłby mi ktoś pomóc?

-- 9 gru 2010, o 18:42 --

Ok, to mam taki kod:

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

/*
Obliczanie wyznacznika metodą rozwinięć Laplace
*/

double det(double**, int);
double odwr(double**, int);

int main(){
int i,j,n;
double** a;
char ch;
do{
printf("Podaj n=");
scanf("%d",&n);
a=(double**)malloc((n+1)*sizeof(double));
for(i=0;i<n+1;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      printf("A[%d][%d]=",i+1,j+1);
      scanf("%lf",&a[i][j]);
    }
printf("\n");
}
printf("det(A)=%lf\n",det(a,n));
odwr(a,n);
for(i=0;i<n+1;i++)
free(a[i]);
free(a);
ch=getch();
} while(ch!=27);
return 0;
}

double det(double** a, int size)
{
   int i, k, l, z = 1;
   double** b;
   double d = 0;
   b=(double**)malloc((size+1)*sizeof(double));
   for(i=0;i<size+1;i++)
   b[i]=(double*)malloc((size+1)*sizeof(double));
   if (size == 1)
      d = a[0][0];
   else
   {
      // rozwiniecie Laplace'a względem pierwszego wiersza
      for (i = 0; i < size; i++)
      {
         // przepisywanie wierszy
         for (k = 0; k < size - 1; k++)
         {
            // przepisywanie kolumn
             for (l = 0; l < size - 1; l++)
            {
                  // przepisanie komórki znajdującej się w tej
                  // samej kolumnie lecz w wierszu poniżej
               if (l < i)  b[k][l] = a[k + 1][l];
                  // przepisanie komórki znajdującej się
                  // w następnej kolumnie i wierszu poniżej
               else  b[k][l]=a[k + 1][l + 1];
            }
         }
         // wywołanie rekurencyjne
         d = d + z * a[0][i] * det(b, size-1);
         // zmiana znaku
         z = -z;
      }
   }
   for(i=0;i<size+1;i++)
   free(b[i]);
   free(b);
   return d;
}

double odwr(double** a, int size)
{
        int i, j, k;
        double** b;
           double d = 0;
   b=(double**)malloc((size+1)*sizeof(double));
   for(i=0;i<size+1;i++)
   b[i]=(double*)malloc((size+1)*sizeof(double));
   if (size == 1)
      d = a[0][0];
   else
   {
                    /*Transponowanie macierzy*/
                    printf("TRANSPONOWANIE MACIERZY:\n\n");
                    for(i=0;i<size-1;i++)
                                    {
                                    for(j=i+1;j<size;j++){
                                    k=a[i][j];
                                    a[i][j]=a[j][i];
                                    a[j][i]=k;
                                    for (i=0; i<size; i++) 
                                     { 
                                        for(j=0; j<size; j++) 
                                         { 
                                         printf("[%d]", a[j][i]);
                                        }
                                               printf("\n");
                                               } 
                                               }         
             }
    /*Odwracanie macierzy*/
    printf("MACIERZ ODWROTNA:\n\n");         
             for(j=0;j<size;j++)
  {
      for(i=0;i<size;i++) 
      {
                       
       d=((1/(det(a,size)))*(a[j][i]));
                       for (i=0; i<size; i++) 
                       { 
                       for(j=0;j<size;j++) 
                       {
                       printf("[%0.2f]", d);
                       }
                       printf("\n");
                       }
}
}  
}
   for(i=0;i<size+1;i++)
   free(b[i]);
   free(b);
   return d;
}
Jednak nadal błednie liczy macierz trasponowaną i co za tym idzie odwrotną. Czy ktoś może wie, gdzie popełniłam błąd?
ODPOWIEDZ