3x3 Matrix (Matrizen) mulitplizieren

Schnelle objektorientierte, kompilierende Programmiersprache.
Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » Di Mär 16, 2021 2:29 am

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!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Xin » Di Mär 16, 2021 11:10 am

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

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » 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.

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Xin » Di Mär 16, 2021 10:07 pm

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

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » Di Mär 16, 2021 10:32 pm

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » Di Mär 16, 2021 11:30 pm

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.

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » 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);

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Xin » Do Mär 18, 2021 9:47 am

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

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » Do Mär 18, 2021 8:00 pm

Danke für die Hinweise! Muss die properties noch genauer testen.

Robocop1
Beiträge: 24
Registriert: Mo Dez 07, 2020 3:59 pm

Re: 3x3 Matrix (Matrizen) mulitplizieren

Beitrag von Robocop1 » Fr Mär 19, 2021 12:37 am

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;
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Antworten