Seite 1 von 2

3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 2:29 am
von Robocop1
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
bild2.PNG
Danke!

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 11:10 am
von Xin
Robocop1 hat geschrieben:
Di Mär 16, 2021 2:29 am
Hi,
Vorweg, bitte Quelltext als Text und nicht als Bild. Ich kann aus Bildern keine Zeilen quoten.
Robocop1 hat geschrieben:
Di Mär 16, 2021 2:29 am
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 ?
Die Schreibweise a[i,k] steht NICHT für den Matrizenzugriff.
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.

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 9:46 pm
von Robocop1
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.

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;
}
Edit by Xin: Codetags eingefügt, ColorTags raus.

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 10:07 pm
von Xin
Robocop1 hat geschrieben:
Di Mär 16, 2021 9:46 pm
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.
Da brauche ich mehr Erklärung... wo passiert was und was erwartest Du, dass da passieren müsste.

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 10:32 pm
von Robocop1
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.
bild7.PNG

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Di Mär 16, 2021 11:30 pm
von Robocop1
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

Verfasst: Do Mär 18, 2021 3:35 am
von Robocop1
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":

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;
}

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Do Mär 18, 2021 9:47 am
von Xin
Robocop1 hat geschrieben:
Do Mär 18, 2021 3:35 am
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":

Code: Alles auswählen

scanf("%d", &a_rows, &a_columns);

Code: Alles auswählen

scanf("%d", &b_rows, &b_columns);
Joah, das ist ja auch korrekt, weil Du nur ein %d hast, aber halt zwei Parameter.

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. :-D

Schau Dir das mal an, so dass Du die Information beim Programmstart gleich mit übergibst.

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Do Mär 18, 2021 8:00 pm
von Robocop1
Danke für die Hinweise! Muss die properties noch genauer testen.

Re: 3x3 Matrix (Matrizen) mulitplizieren

Verfasst: Fr Mär 19, 2021 12:37 am
von Robocop1
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??
bild10.PNG

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;
}