matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenC/C++matrix multiplikation
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Informatik • Physik • Technik • Biologie • Chemie
Forum "C/C++" - matrix multiplikation
matrix multiplikation < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

matrix multiplikation: tipps gesucht
Status: (Frage) beantwortet Status 
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 :) )

        
Bezug
matrix multiplikation: Antwort
Status: (Antwort) fertig Status 
Datum: 00:47 Mo 22.11.2010
Autor: Event_Horizon

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.

Bezug
                
Bezug
matrix multiplikation: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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???

Bezug
                        
Bezug
matrix multiplikation: Antwort
Status: (Antwort) fertig Status 
Datum: 20:15 Mo 22.11.2010
Autor: Event_Horizon

Hallo!

Na, wie ich geschrieben habe:

> Statt *(p+k+j*n1) brauchst du eher p[k+j*n1] , das ist auch übersichtlicher.

Bezug
                                
Bezug
matrix multiplikation: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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.



Bezug
                                        
Bezug
matrix multiplikation: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 21:25 Mo 22.11.2010
Autor: Event_Horizon


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)

Bezug
                                                
Bezug
matrix multiplikation: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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? [verwirrt]

Oh, da ist wohl was kaputtgegangen. Es ist ein Link []hierhin gewesen.

LG Felix




Bezug
                                                        
Bezug
matrix multiplikation: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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???

Bezug
                                                                
Bezug
matrix multiplikation: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                                                                        
Bezug
matrix multiplikation: Frage (überfällig)
Status: (Frage) überfällig Status 
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));

Bezug
                                                                                
Bezug
matrix multiplikation: geschaft
Status: (Mitteilung) Reaktion unnötig Status 
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: }


Bezug
                                                                                
Bezug
matrix multiplikation: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 22:20 Mi 24.11.2010
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]