3x3 Matrix (Matrizen) mulitplizieren
3x3 Matrix (Matrizen) mulitplizieren
Hi,
ich verstehe nicht wie C erkennt, dass bei Eingabe von 3x3 Matrix-Elementen, er nach 3 Eingaben in die nächste Zeile hüpfen muss.
Und woher erkennt C die "Koordinaten", dass bei sum += a [i,k] * b[k][j]
=> [i,k] für die Zeilen- und Spaltennummer von Matrix A steht,
bzw.
=> [k][j] für die Spalten- und Zeilennummer von Matrix B ?
https://youtu.be/jzdQqoG1tZs?t=384
Danke!
ich verstehe nicht wie C erkennt, dass bei Eingabe von 3x3 Matrix-Elementen, er nach 3 Eingaben in die nächste Zeile hüpfen muss.
Und woher erkennt C die "Koordinaten", dass bei sum += a [i,k] * b[k][j]
=> [i,k] für die Zeilen- und Spaltennummer von Matrix A steht,
bzw.
=> [k][j] für die Spalten- und Zeilennummer von Matrix B ?
https://youtu.be/jzdQqoG1tZs?t=384
Danke!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: 3x3 Matrix (Matrizen) mulitplizieren
Vorweg, bitte Quelltext als Text und nicht als Bild. Ich kann aus Bildern keine Zeilen quoten.
Die Schreibweise a[i,k] steht NICHT für den Matrizenzugriff.Robocop1 hat geschrieben: ↑Di Mär 16, 2021 2:29 amich verstehe nicht wie C erkennt, dass bei Eingabe von 3x3 Matrix-Elementen, er nach 3 Eingaben in die nächste Zeile hüpfen muss.
Und woher erkennt C die "Koordinaten", dass bei sum += a [i,k] * b[k][j]
=> [i,k] für die Zeilen- und Spaltennummer von Matrix A steht,
bzw.
=> [k][j] für die Spalten- und Zeilennummer von Matrix B ?
Es gibt in C nur Vektoren, also nur eindimensionale Arrays. Es gibt keine Matrizen.
Darum gibt es auch keinen Zugriff in der Form [i,k].
Was es gibt ist der Komma-Operator und der führt das linke Argument aus, dann das rechte und gibt das Ergebnis des rechten Operanden zurück. Statt i,k kannst Du also auch einfach k schreiben. Wenn Du a[i,k] schreibst passiert a[k], also der Zugriff auf ein eindimensionales Objekt an der Position k.
Der Zugriff b[k][j] ist korrekt. Wenn b ein zweidimensionales Array ist, sagen wir int b[2][4], dann ist b ein eindimensionales Array mit 4 Arrays der Größe 2 ints. Die ints liegen alle hintereinander im Speicher.
Schauen wir uns das im Speicher an. Das ist b: {{11,12},{21,22},{31,32},{41,42}}. Die Zahlen liegen hintereinander im Speicher.
Wenn Du also auf das Element b[k][j] zugriefst, ist ist b[k] das k. Zweierarray. b[1] guckt also wo liegt b, zum Beispiel an Adresse 1000. Jetzt überspringst Du 1 mal den Typen, des Arrays. Der Typ ist int[2], also zwei ints. Zwei ints sind 8 Byte groß, das addieren wir auf die 1000: An Adresse 1008 liegt also etwas, was ein int[2] darstellen so. Jetzt kommt die zweite Klammer {21,22}[0]. {21,22} ist ein Array aus ints. Ein int ist 4 Byte groß, davon möchte ich 0 überspringen. 1008 + 0*4 Bytes sind 1008. An Adresse 1008 finde ich also die Zahl, die b[1][0] adressieren soll: 21.
Das funktioniert auch mit b[0][2]. b ist 1000, wir überspringen 0 2-int-Arrays, also bekommen wir wieder tausend 1000 raus. Jetzt haben wir ein Array von ints. Hier überspringen wir zwei ints. 1000+2*4 sind 1008. Das Element b[0][2], also das dritte Element in ersten zweier Array ist 21, die sich offiziell gar nicht in den Typen reinpasst, und sich auch nicht darin befindet. b[0][2] wäre hier ein Programmierfehler.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Okay danke, habe nun mal den Code eingegeben, die Matrix-Multiplikation funkt allerdings noch nicht. Das Problem mit "-i- in eckigen Klammern" ist, dass das bei mir hier nicht angezeigt / unsichtbar wird.
Edit by Xin: Codetags eingefügt, ColorTags raus.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#define max 50
int main() {
int a[max][max], b[max][max], product[max][max];
int arows, acolumns, brows, bcolumns;
int i, j, k;
int sum = 0;
printf("Enter # of rows & # of columns of Matrix A: ");
scanf("%d %d", &arows, &acolumns);
printf("Enter cell values of Matrix A:\n");
for(i=0; i<arows; i++)
{
for(j=0; j<acolumns; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("Enter #rows & #columns of Matrix B: ");
scanf("%d %d", &brows, &bcolumns);
if(brows != acolumns)
{
printf("Sorry! We cannot multiply matrices A and B");
}
else
{
printf("Enter cell values of Matrix B: \n");
for(i=0; i<brows; i++)
{
for(j=0; j<bcolumns; j++)
{
scanf("%d", &b[i][j]);
}
}
}
printf("\n");
for(i=0; i<arows; i++)
{
for(j=0; j<bcolumns; i++)
{
for(k=0; k<brows; k++)
{
sum += a[i][k] * b[k][j];
}
product[i][j] = sum;
sum=0;
}
}
//Printing array elements
printf("Resultant Matrix \n");
for(i=0; i<arows; i++)
{
for(j=0; j<bcolumns; j++)
{
printf("%d ", product[i][j]);
}
printf("\n");
}
return 0;
}
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: 3x3 Matrix (Matrizen) mulitplizieren
Da brauche ich mehr Erklärung... wo passiert was und was erwartest Du, dass da passieren müsste.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Der Code müsste beide Matrizen multiplizieren, indem Zahlen in jew. Zeile von Matrix1 mit Zahlen in jew. Spalte in Matrix2 mulipliziert und addiert werden, um zur resultant Matrix zu kommen - Zahlen in neuer Matrix ergeben sich dort, wo Schnittstelle aus Zeile Matrix1 u. Spalte Matrix2 ist:
12 in resultant Matrix = 1*1 + 2*1 + 3*3
7 rechts Mitte = 1*3 + 2*1 + 1*2
10 unten Mitte = 3*2 + 1*2 + 2*1
Bei mir im obigen Code (danke für tags), wird jedoch gar nichts multipliziert im Terminal-window, nicht mal falsch.
12 in resultant Matrix = 1*1 + 2*1 + 3*3
7 rechts Mitte = 1*3 + 2*1 + 1*2
10 unten Mitte = 3*2 + 1*2 + 2*1
Bei mir im obigen Code (danke für tags), wird jedoch gar nichts multipliziert im Terminal-window, nicht mal falsch.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Habs schon, a[2][3] darf man nicht als Matrix mit Zeilen "untereinander" betrachten sondern wie von dir erwähnt als 2 Vektoren die je 3 Werte beinhalten.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Kurze Frage, kann ich per scanf mit 1 einzigen entry, für zwei integers => a_columns + a_rows => z.B. 4 festlegen (4 Spalte/Reihen der Matrix), anstatt "4 4" einzugeben???
Hier schreit er, "too many formats":
Danke im Voraus!
Sonst funkt der Code jedenfalls:
Hier schreit er, "too many formats":
Code: Alles auswählen
scanf("%d", &a_rows, &a_columns);
Code: Alles auswählen
scanf("%d", &b_rows, &b_columns);
Danke im Voraus!
Sonst funkt der Code jedenfalls:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int main()
{
// Define variables - max. Matrix size defined as 50
int a[MAX][MAX], b[MAX][MAX], c[MAX][MAX];
int a_rows, a_columns, b_rows, b_columns, x, y, z;
int sum = 0;
// Determine Matrix size, prior to elements entries
printf("Enter size of Matrix a: ");
scanf("%d %d", &a_rows, &a_columns);
printf("Enter the elements of matrix a:\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<a_columns; y++)
{
scanf("%d", &a[x][y]);
}
}
// Determine Matrix size, prior to elements entries
printf("Enter size of Matrix b: ");
scanf("%d %d", &b_rows, &b_columns);
printf("Enter the elements of Matrix b:\n");
for(x=0; x<b_rows; x++)
{
for(y=0; y<b_columns; y++)
{
scanf("%d", &b[x][y]);
}
}
printf("\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<b_columns; y++)
{
for(z=0; z<b_rows; z++)
{
sum += a[x][z] * b[z][y];
}
c[x][y] = sum;
sum = 0;
}
}
// Printing the array elements:
printf("Matrix C:\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<b_columns; y++)
{
printf("%d ", c[x][y]);
}
printf("\n");
}
return 0;
}
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: 3x3 Matrix (Matrizen) mulitplizieren
Joah, das ist ja auch korrekt, weil Du nur ein %d hast, aber halt zwei Parameter.Robocop1 hat geschrieben: ↑Do Mär 18, 2021 3:35 amKurze Frage, kann ich per scanf mit 1 einzigen entry, für zwei integers => a_columns + a_rows => z.B. 4 festlegen (4 Spalte/Reihen der Matrix), anstatt "4 4" einzugeben???
Hier schreit er, "too many formats":Code: Alles auswählen
scanf("%d", &a_rows, &a_columns);
Code: Alles auswählen
scanf("%d", &b_rows, &b_columns);
Was Du da machst, wirst nicht funktionieren, weil Du die Werte einzeln abfragen müsstest, Du müsstest also vorher abfragen ob Du nur einen Wert abfragen sollst oder zwei, womit Du für einen Wert auch zwei Abfragen hast.

Schau Dir das mal an, so dass Du die Information beim Programmstart gleich mit übergibst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Danke für die Hinweise! Muss die properties noch genauer testen.
Re: 3x3 Matrix (Matrizen) mulitplizieren
Eine letzte Frage hätte ich bitte zu "Matrizen"-Arrays.
Ich müsste für die Aufgabe den folgenden Code so umschreiben, dass rechts im Terminal Window die Textzeilen/printf verschwinden, bzw die array-size nur als "3" anstatt "3 3" eingegeben wird. Wenn ich jedoch printfs rauslösche funktioniert der Code allerdings nicht mehr bzw Eingabe spielt verrückt, muss ich da irgendetwas besonderes beachten??
Ich müsste für die Aufgabe den folgenden Code so umschreiben, dass rechts im Terminal Window die Textzeilen/printf verschwinden, bzw die array-size nur als "3" anstatt "3 3" eingegeben wird. Wenn ich jedoch printfs rauslösche funktioniert der Code allerdings nicht mehr bzw Eingabe spielt verrückt, muss ich da irgendetwas besonderes beachten??
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int main()
{
// Define variables - max. Matrix size defined as 50
int a[MAX][MAX], b[MAX][MAX], c[MAX][MAX];
int a_rows, a_columns, b_rows, b_columns, x, y, z;
int sum = 0;
// Determine Matrix size, prior to elements entries
printf("Enter size of Matrix a: ");
scanf("%d %d", &a_rows, &a_columns);
printf("Enter the elements of matrix a:\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<a_columns; y++)
{
scanf("%d", &a[x][y]);
}
}
// Determine Matrix size, prior to elements entries
printf("Enter size of Matrix b: ");
scanf("%d %d", &b_rows, &b_columns);
printf("Enter the elements of Matrix b:\n");
for(x=0; x<b_rows; x++)
{
for(y=0; y<b_columns; y++)
{
scanf("%d", &b[x][y]);
}
}
printf("\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<b_columns; y++)
{
for(z=0; z<b_rows; z++)
{
sum += a[x][z] * b[z][y];
}
c[x][y] = sum;
sum = 0;
}
}
// Printing the array elements:
printf("Matrix C:\n");
for(x=0; x<a_rows; x++)
{
for(y=0; y<b_columns; y++)
{
printf("%d ", c[x][y]);
}
printf("\n");
}
return 0;
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.