kotopoulos Δημοσ. 27 Νοεμβρίου 2010 Μέλος Δημοσ. 27 Νοεμβρίου 2010 επανερχομαι λιγο στην αρχικη απορια... επιδη θελω να το κανω να δουλευει για το μεγεθος που εγω θελω καθε φορα κ να μην χρειαζεται να μπαινω στον κωδικα να αλλαζω το define κ να το τρεχω παλι.. πως θα περασω ενα δυσδιαστατο πινακα(οριζεται δυναμικα ο πινακας στην εκτελεση του προγραμματος) σαν παραμετρο σε μια συναρτηση? οτι εχω δοκιμασει δεν δουλευει...τον μονοδιαστατο τον περναει κανονικα..
virxen75 Δημοσ. 28 Νοεμβρίου 2010 Δημοσ. 28 Νοεμβρίου 2010 επανερχομαι λιγο στην αρχικη απορια... επιδη θελω να το κανω να δουλευει για το μεγεθος που εγω θελω καθε φορα κ να μην χρειαζεται να μπαινω στον κωδικα να αλλαζω το define κ να το τρεχω παλι.. πως θα περασω ενα δυσδιαστατο πινακα(οριζεται δυναμικα ο πινακας στην εκτελεση του προγραμματος) σαν παραμετρο σε μια συναρτηση? οτι εχω δοκιμασει δεν δουλευει...τον μονοδιαστατο τον περναει κανονικα.. αυτό το έχεις δοκιμάσει? > #include <stdio.h> #include <stdlib.h> #include <malloc.h> void printArray(int **, int , int ); int main(){ int i,j,k=0, m=3, n=5; int **a=(int **)malloc(m*sizeof(int *));//orismos pinaka(grammes) for(i=0;i<m;i++)//orismos pinaka(stiles) a[i]=(int *)malloc(n*sizeof(int)); for(i=0;i<m;i++)//gemisma pinaka for(j=0;j<n;j++) a[i][j]=++k; printArray(a,m,n);//pinakas,grammes,stiles system("PAUSE"); return 0; } void printArray(int **array, int m, int n){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++) printf(" %4d ",array[i][j]); printf("\n"); } }
V.I.Smirnov Δημοσ. 29 Νοεμβρίου 2010 Δημοσ. 29 Νοεμβρίου 2010 Δοθείσης της ευκαιρίας, σκέφτηκα να παραθέσω μια ρουτίνα της προκοπής για επίλυση γρ. συστήματος και αντιστροφή πίνακα με απαλοιφή Gauss. Την έχω να μου βρίσκεται για ώρα ανάγκης. Κάνει και πλήρες pivoting. Ως γνωστόν, ρουτίνα απαλοιφής Gauss ή LU χωρίς pivoting ΔΕΝ νοείται. >/* Gauss elimination with pivoting ------------------------------- V.I.Smirnov --------------- */ #include <stdio.h> #include <stddef.h> #include <stdlib.h> #define NR_END 1 #define FREE_ARG char* void errorMessage(char error_text[]) { fprintf(stderr,"Run-time error...\n"); fprintf(stderr,"%s\n",error_text); fprintf(stderr,"...exiting to system...\n"); exit(1); } int *ivector(long nl, long nh) { int *v; v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int))); if (!v) errorMessage("memory allocation 1 failure"); return v-nl+NR_END; } void free_ivector(int *v, long nl, long nh) { free((FREE_ARG) (v+nl-NR_END)); } float **matrix(long nrl, long nrh, long ncl, long nch) { long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; float **m; /* allocate pointers to rows */ m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*))); if (!m) errorMessage("memory allocation 2 failure"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float))); if (!m[nrl]) errorMessage("memory allocation 3 failure"); m[nrl] += NR_END; m[nrl] -= ncl; for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; /* return pointer to array of pointers to rows */ return m; } void free_matrix(float **m, long nrl, long nrh, long ncl, long nch) { free((FREE_ARG) (m[nrl]+ncl-NR_END)); free((FREE_ARG) (m+nrl-NR_END)); } #include <math.h> #define SWAP(a, {temp=(a);(a)=(;(=temp;} void GaussElimination(float **a, int n, float **b, int m) { int *indxc,*indxr,*ipiv; int i,icol,irow,j,k,l,ll; float big,dum,pivinv,temp; indxc=ivector(1,n); indxr=ivector(1,n); ipiv=ivector(1,n); for (j=1;j<=n;j++) ipiv[j]=0; for (i=1;i<=n;i++) { big=0.0; for (j=1;j<=n;j++) if (ipiv[j] != 1) for (k=1;k<=n;k++) { if (ipiv[k] == 0) { if (fabs(a[j][k]) >= big) { big=fabs(a[j][k]); irow=j; icol=k; } } } ++(ipiv[icol]); if (irow != icol) { for (l=1;l<=n;l++) SWAP(a[irow][l],a[icol][l]) for (l=1;l<=m;l++) SWAP(b[irow][l],b[icol][l]) } indxr[i]=irow; indxc[i]=icol; if (a[icol][icol] == 0.0) errorMessage("Singular matrix encountered"); pivinv=1.0/a[icol][icol]; a[icol][icol]=1.0; for (l=1;l<=n;l++) a[icol][l] *= pivinv; for (l=1;l<=m;l++) b[icol][l] *= pivinv; for (ll=1;ll<=n;ll++) if (ll != icol) { dum=a[ll][icol]; a[ll][icol]=0.0; for (l=1;l<=n;l++) a[ll][l] -= a[icol][l]*dum; for (l=1;l<=m;l++) b[ll][l] -= b[icol][l]*dum; } } for (l=n;l>=1;l--) { if (indxr[l] != indxc[l]) for (k=1;k<=n;k++) SWAP(a[k][indxr[l]],a[k][indxc[l]]); } free_ivector(ipiv,1,n); free_ivector(indxr,1,n); free_ivector(indxc,1,n); } /* Trial of routine GaussElimination */ #include <stdio.h> #include <stdlib.h> #define NP 20 #define MP 20 #define MAXSTR 80 int main(void) { int j,k,l,m,n; float **a,**ai,**u,**b,**x,**t; char dummy[MAXSTR]; FILE *fp; a=matrix(1,NP,1,NP); ai=matrix(1,NP,1,NP); u=matrix(1,NP,1,NP); b=matrix(1,NP,1,MP); x=matrix(1,NP,1,MP); t=matrix(1,NP,1,MP); if ((fp = fopen("matrx1.txt","r")) == NULL) errorMessage("Data file matrx1.txt not found\n"); while (!feof(fp)) { fgets(dummy,MAXSTR,fp); fgets(dummy,MAXSTR,fp); fscanf(fp,"%d %d ",&n,&m); fgets(dummy,MAXSTR,fp); for (k=1;k<=n;k++) for (l=1;l<=n;l++) fscanf(fp,"%f ",&a[k][l]); fgets(dummy,MAXSTR,fp); for (l=1;l<=m;l++) for (k=1;k<=n;k++) fscanf(fp,"%f ",&b[k][l]); /* save matrices for later testing of results */ for (l=1;l<=n;l++) { for (k=1;k<=n;k++) ai[k][l]=a[k][l]; for (k=1;k<=m;k++) x[l][k]=b[l][k]; } /* invert matrix */ GaussElimination(ai,n,x,m); printf("\nInverse of matrix a : \n"); for (k=1;k<=n;k++) { for (l=1;l<=n;l++) printf("%12.6f",ai[k][l]); printf("\n"); } /* check inverse */ printf("\na times a-inverse:\n"); for (k=1;k<=n;k++) { for (l=1;l<=n;l++) { u[k][l]=0.0; for (j=1;j<=n;j++) u[k][l] += (a[k][j]*ai[j][l]); } for (l=1;l<=n;l++) printf("%12.6f",u[k][l]); printf("\n"); } /* check vector solutions */ printf("\nCheck the following for equality:\n"); printf("%21s %14s\n","original","matrix*sol'n"); for (l=1;l<=m;l++) { printf("vector %2d: \n",l); for (k=1;k<=n;k++) { t[k][l]=0.0; for (j=1;j<=n;j++) t[k][l] += (a[k][j]*x[j][l]); printf("%8s %12.6f %12.6f\n"," ", b[k][l],t[k][l]); } } printf("***********************************\n"); printf("press RETURN for next problem:\n"); (void) getchar(); } fclose(fp); free_matrix(t,1,NP,1,MP); free_matrix(x,1,NP,1,MP); free_matrix(b,1,NP,1,MP); free_matrix(u,1,NP,1,NP); free_matrix(ai,1,NP,1,NP); free_matrix(a,1,NP,1,NP); return 0; } Σώσε το παρακάτω σε ένα txt αρχείο με όνομα matrx1.txt για να τρέξει η main και να λύσει κάποια δοκιμαστικά συστήματα... >MATRICES FOR INPUT TO TEST ROUTINES Size of matrix (NxN), Number of solutions: 3 2 Matrix A: 1.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 3.0 Solution vectors: 1.0 0.0 0.0 1.0 1.0 1.0 NEXT PROBLEM Size of matrix (NxN), Number of solutions: 3 2 Matrix A: 1.0 2.0 3.0 2.0 2.0 3.0 3.0 3.0 3.0 Solution vectors: 1.0 1.0 1.0 1.0 2.0 3.0 NEXT PROBLEM: Size of matrix (NxN), Number of solutions: 5 2 Matrix A: 1.0 2.0 3.0 4.0 5.0 2.0 3.0 4.0 5.0 1.0 3.0 4.0 5.0 1.0 2.0 4.0 5.0 1.0 2.0 3.0 5.0 1.0 2.0 3.0 4.0 Solution vectors: 1.0 1.0 1.0 1.0 1.0 1.0 2.0 3.0 4.0 5.0 NEXT PROBLEM: Size of matrix (NxN), Number of solutions: 5 2 Matrix A: 1.4 2.1 2.1 7.4 9.6 1.6 1.5 1.1 0.7 5.0 3.8 8.0 9.6 5.4 8.8 4.6 8.2 8.4 0.4 8.0 2.6 2.9 0.1 9.6 7.7 Solution vectors: 1.1 1.6 4.7 9.1 0.1 4.0 9.3 8.4 0.4 4.1 Μεγάλο μειονέκτημα της παραπάνω ρουτίνας είναι ότι δεν λειτουργεί για μιγαδικούς. Η εκδοχή της που έχω στην fortran έχει την μισή έκταση από την παραπάνω, είναι αναμφισβήτητα πιο σαφής και το κυριότερο : εφαρμόζεται σχεδόν αυτούσια ακόμα και όταν το σύστημα είναι μιγαδικό ! (μιγαδικοί αριθμοί) -
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.