www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

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:

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.vorhilfe.de