www.vorkurse.de
Ein Projekt von vorhilfe.de
Die Online-Kurse der Vorhilfe

E-Learning leicht gemacht.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Teams · Forum · Wissen · Kurse · Impressum
Forenbaum
^ Forenbaum
Status Mathe-Vorkurse
  Status Organisatorisches
  Status Schule
    Status Wiederholung Algebra
    Status Einführung Analysis
    Status Einführung Analytisc
    Status VK 21: Mathematik 6.
    Status VK 37: Kurvendiskussionen
    Status VK Abivorbereitungen
  Status Universität
    Status Lerngruppe LinAlg
    Status VK 13 Analysis I FH
    Status Algebra 2006
    Status VK 22: Algebra 2007
    Status GruMiHH 06
    Status VK 58: Algebra 1
    Status VK 59: Lineare Algebra
    Status VK 60: Analysis
    Status Wahrscheinlichkeitst

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
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
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.vorkurse.de
[ Startseite | Mitglieder | Teams | Forum | Wissen | Kurse | Impressum ]