matrix multiplikation < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 22:08 So 21.11.2010 | Autor: | adamo |
Aufgabe | #include <stdlib.h>
#include <stdio.h>
void mat_print(int *m3,int z,int s)
{ int i,j;
for(i=0;i<z;i++)
for(j=0;j<s;j++)
[mm] printf("%d\t",*(m3+i*s+j));
[/mm]
}
void main()
{
int *p,*q,*r,i,n1,m1,m2,n2,j,k,erg;
printf("zeiele von 1 matrx");
scanf("%d",&m1);
printf("spalten von 1 matrx");
scanf("%d",&n1);
printf("zeiele von 2 matrx");
scanf("%d",&m2);
printf("spalten von 2 matrx");
scanf("%d",&n2);
p=(int*)malloc(m1*(n1*(sizeof(int))));
q=(int*)malloc(m2*(n2*(sizeof(int))));
r=(int*)malloc(m1*(n2*(sizeof(int))));
for(i=0;i<(m1*n1);i++)
{
printf("%d zahl von 1 matrix",i+1);
scanf("%d",&p[i]);
}
for(i=0;i<(m2*n2);i++)
{
printf("%d zahl von 2 matrix",i+1);
scanf("%d",&q[i]);
}
erg=0;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
{ *(r+i+j*m2)=erg;
*(r+i+j*m2)=erg+(*(p+k+j*n1)*(*(q+k*m2+j)));
[mm] printf("............%d\n",r[i]);
[/mm]
}
mat_print(r,m1,n2);
getchar();
getchar();
} |
so ich versuche seit paar stunden ein program für matrix multiplikation zu schreiben. Es soll dynamisch sein (für eine beliebige matrix) funktioniert faaast gut,es fällt nur eine richitge ,,verschiebung in einer adressen stelle''.
*(r+i+j*m2)=erg;
*(r+i+j*m2)=erg+(*(p+k+j*n1)*(*(q+k*m2+j)));
ich möchte dass er sich in *p spalten weise verschiebt und gleichzeitig mit *q multipliziert und dann +1 bis ende der reihe/spalte und dazu paar mal in *r schpeichert und dann in nächsten element von *r speichert (so wie man normalerweise matrix multipliezieren würde) er macht das aber leider nicht , sieht man das vll wieso ???
PS. es muss hier aber so sein dass es auf einer verschiebung basis in einer reservierten speicher adresse dieser program laufen soll weil so hat sich mein lerer gewünscht.
Man kann das (glaube ich) mit 2 dimensionalen arreys machen aber es wurde mir nicht erlaubt(ich weiss nicht ob ich das noch hienkriegen würde :) )
|
|
|
|
Hallo!
Ich verstehe deine Zeilen *(...) nicht, das macht keinen Sinn. (Zumal, wenn du tatsächlich völlig zu Fuß die Adresse ausrechnen willst, da irgendwie noch die Länge eines INT (meist 4Byte) berücksichtigen mußt.
Denk dran, p ist ein Pointer auf ein INT-Array. Dann solltest du mit p[0] auf das erste Element, mit p[1] auf das zweite etc. zugreifen können.
(Du mußt nicht unbedingt p* deklarieren, es geht auch p[] )
Statt *(p+k+j*n1) brauchst du eher p[k+j*n1] , das ist auch übersichtlicher.
Das mit den 2D-Arrays ist kein Verbot deines Lehrers. Viel mehr kennt der Computer selbst keine zweidimensionalen Arrays, und wenn du p[j][k] schreibst, formt der Compiler das intern in p[k+j*n1] um. Dazu muß der Compiler aber das n1 kennen, was er sich eigentlich von der Deklaration wie int p[3][4]; holt. Du hast hier in C allerdings keine Möglichkeit, bei einem mit malloc erstellen Feld sowas wie die Größen der einzelnen Dimensionen anzugeben, daher geht das bei dir gar nicht.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:06 Mo 22.11.2010 | Autor: | adamo |
na dann wie denn sonst??? wenn das falsch ist.
Es muss malloc funktion benutz werden, und es muss für beliebiege matrix funktionieren. wie würdest du das machen???
|
|
|
|
|
Hallo!
Na, wie ich geschrieben habe:
> Statt *(p+k+j*n1) brauchst du eher p[k+j*n1] , das ist auch übersichtlicher.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:04 Mo 22.11.2010 | Autor: | felixf |
Moin!
> Na, wie ich geschrieben habe:
>
> > Statt *(p+k+j*n1) brauchst du eher p[k+j*n1] , das ist auch
> übersichtlicher.
Ist uebrigens beides genau das gleiche. Ebenso wie (k + j * n1)[p].
Aber es hat schon einen Grund, warum man besser p[k + j * n1] schreiben sollte :)
LG Felix
PS: Hier kann man das etwa nachlesen, siehe insb. die letzte Zeile des Abschnitts.
|
|
|
|
|
Hallo
moment...
Bei
p[k+j*n1]
ist klar, daß es hier um Integerzahlen an Speicherstellen geht, und daß man
von der Adresse p aus "k+j*n1" INTs weiter gehen muß.
Gut, ich hätte nicht gedacht, daß *(p+k+j*n1) geht, aber müßte das dann nicht zumindest *(p+4*(k+j*n1)) heißen, um die Länge der INTs (die einfach mal 4 sein soll) zu berücksichtigen?
(Dein Dateianhang fehlt nebenbei)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:28 Mo 22.11.2010 | Autor: | felixf |
Moin!
> moment...
>
> Bei
>
> p[k+j*n1]
>
> ist klar, daß es hier um Integerzahlen an Speicherstellen
> geht, und daß man
> von der Adresse p aus "k+j*n1" INTs weiter gehen muß.
Genau.
Bei $p + k + j * n1$ ebenfalls.
> Gut, ich hätte nicht gedacht, daß *(p+k+j*n1) geht,
Dochdoch. Ein int* zeigt auf einen Int, und wenn du 1 dazuaddierst, zeigt es auf den naechsten int.
> aber
> müßte das dann nicht zumindest *(p+4*(k+j*n1)) heißen,
> um die Länge der INTs (die einfach mal 4 sein soll) zu
> berücksichtigen?
Erstens muss ein int gar nicht die Laenge 4 haben, und zweitens gilt das oben geschriebene: wenn du einen Zeiger auf ein X um 1 aenderst, zeigt er auf das naechste X, nicht auf das naechste Byte.
> (Dein Dateianhang fehlt nebenbei)
Was fuer ein Dateianhang?
Oh, da ist wohl was kaputtgegangen. Es ist ein Link hierhin gewesen.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:52 Mo 22.11.2010 | Autor: | adamo |
Aufgabe | #include <stdlib.h>
#include <stdio.h>
void mat_print(int *m3,int z,int s)
{ int i,j;
for(i=0;i<(z*s);i++)
[mm] printf("%d\t",m3[i]);
[/mm]
}
void main()
{
int *p,*q,*r,i,n1,m1,m2,n2,j,k,erg;
printf("zeiele von 1 matrx");
scanf("%d",&m1);
printf("spalten von 1 matrx");
scanf("%d",&n1);
printf("zeiele von 2 matrx");
scanf("%d",&m2);
printf("spalten von 2 matrx");
scanf("%d",&n2);
p=(int*)malloc(m1*n1*(sizeof(int)));
q=(int*)malloc(m2*n2*(sizeof(int)));
r=(int*)malloc(m1*n2*(sizeof(int)));
for(i=0;i<(m1*n1);i++)
{
printf("%d zahl von 1 matrix",i+1);
scanf("%d",&p[i]);
}
for(i=0;i<(m2*n2);i++)
{
printf("%d zahl von 2 matrix",i+1);
scanf("%d",&q[i]);
}
for(i=0;i<m1;i++)
{
for(j=0;j<n2;j++)
*(r+i+j*n2)=0;
for(k=0;k<n1;k++)
{
*(r+i+j*n2)=*(r+i+j*n2)+*(p+k+j*n1)*(*(q+k*n2+j));
}
}
mat_print(r,m1,n2);
getchar();
getchar();
} |
Bei mir sieht das quelcode so aus.Leider funktioniert mein program nicht wie ich es will(er soll immer noch 2 belibig grosse matrizen multipizieren) auch wenn ich diese p[i+j*n1] schreibwiese verwende funktioniert das auch nicht,sieht ihr vll noch andere fehler???
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:58 Mo 22.11.2010 | Autor: | felixf |
Moin
Wie waer's, wenn du [code]...[/code] verwenden wuerdest fuer den Quelltext? Dann waer das ganze etwas besser lesbar und zitierbar.
> [mm][i][i][i] Bei mir sieht das quelcode so aus.Leider funktioniert mein [/i][/i][/i][/mm]
> [mm][i][i][i]program nicht wie ich es will(er soll immer noch 2 belibig [/i][/i][/i][/mm]
> [mm][i][i][i]grosse matrizen multipizieren) auch wenn ich diese [/i][/i][/i][/mm]
Diese Fehlerbeschreibung ist ungenuegend.
> [mm][i][i][i]p[i+j*n1] schreibwiese verwende funktioniert das auch [/i][/i][/i][/mm]
> [mm][i][i][i]nicht,sieht ihr vll noch andere fehler??? [/i][/i][/i][/mm]
Diese Zeile ist falsch:
> *(r+i+j*n2)=*(r+i+j*n2)+*(p+k+j*n1)*(*(q+k*n2+j));
LG Felix
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 22:15 Mo 22.11.2010 | Autor: | adamo |
> Moin
>
> Wie waer's, wenn du [code]...[/code] verwenden
> wuerdest fuer den Quelltext? Dann waer das ganze etwas
> besser lesbar und zitierbar.
vll eine dumme frage aber meint du dass ich es so machen soll:
Quelltext ??????????????
>
> > [mm][i][i][i]Bei mir sieht das quelcode so aus.Leider funktioniert mein[/i][/i][/i][/mm]
>
> > [mm][i][i][i]program nicht wie ich es will(er soll immer noch 2 belibig[/i][/i][/i][/mm]
>
> > [mm][i][i][i]grosse matrizen multipizieren) auch wenn ich diese[/i][/i][/i][/mm]
>
> Diese Fehlerbeschreibung ist ungenuegend.
ich habe gehoft dass du es selber austestest.
>
> > [mm][i][i][i]p[i+j*n1] schreibwiese verwende funktioniert das auch[/i][/i][/i][/mm]
> >
> [mm][i][i][i]nicht,sieht ihr vll noch andere fehler???[/i][/i][/i][/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
>
> Diese Zeile ist falsch:
>
> > *(r+i+j*n2)=*(r+i+j*n2)+*(p+k+j*n1)*(*(q+k*n2+j));
>
> LG Felix
>
also es sieht so aus dass er sich falsch verschiebt. das dieser zeiele falsch ist ist mir auch klar :)
jetzt es ist noch so aus dass ich es in 2 for schleife initialisiere meine 3 matrix (*r) auf null sonnst nimmt er irgendwelche werte und schreibt dazu nur mein ergebnis.
Er gib mir jetzt aber meine initlialiesirung ab und nicht ausgerechnete werte.
for(j=0;j<n2;j++)
*(r+i+j*n2)=0;
for(k=0;k<n1;k++)
{
*(r+i+j*n2)=*(r+i+j*n2)+(p+k+j*n1)*(*(q+k*n2+j));
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:23 Di 23.11.2010 | Autor: | adamo |
Es hat sich erledigt. Ich habs selber hingekreigt :)
Falls jmd auch sowas irgendwann suchen würde (wie man eine belibige grosse matrix[qudratische] multiplizieren kann)
hier stelle ich die lösg:
1: |
| 2: | #include <stdlib.h>
| 3: | #include <stdio.h>
| 4: | void mat_print(int *m3,int z)
| 5: | { int i,j;
| 6: | for(i=0;i<z;i++)
| 7: | for(j=0;j<z;j++)
| 8: | printf("%d\t",*(m3+i+j*z));
| 9: | }
| 10: | void main()
| 11: | {
| 12: | int *p,*q,*r,i,n1,m1,m2,n2,j,k;
| 13: | printf("wie gross?");
| 14: | scanf("%d",&m1);
| 15: | p=(int*)malloc(m1*m1*(sizeof(int)));
| 16: | q=(int*)malloc(m1*m1*(sizeof(int)));
| 17: | r=(int*)malloc(m1*m1*(sizeof(int)));
| 18: |
| 19: | for(i=0;i<m1;i++)
| 20: | for(j=0;j<m1;j++)
| 21: | {
| 22: | printf("%d zahl von 1 matrix",i+1);
| 23: | scanf("%d",&*(p+i*m1+j));
| 24: | }
| 25: | for(i=0;i<m1;i++)
| 26: | for(j=0;j<m1;j++)
| 27: | {
| 28: | printf("%d zahl von 2 matrix",i+1);
| 29: | scanf("%d",&*(q+i*m1+j));
| 30: | }
| 31: |
| 32: | for(i=0;i<m1;i++)
| 33: | for(j=0;j<m1;j++)
| 34: | {
| 35: | *(r+i*m1+j)=0;
| 36: | for(k=0;k<m1;k++)
| 37: | *(r+i*m1+j)+=*(p+k+i*m1)*(*(q+k*m1+j));
| 38: |
| 39: | }
| 40: | mat_print(r,m1);
| 41: | getchar();
| 42: | getchar();
| 43: | }
|
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:20 Mi 24.11.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|