Matrix in Array speichern



  • asdf



  • fredneumi schrieb:

    hallo.
    ich muss aus einer Matrix : double A[2][3] = {{1,2,3},{4,5,6}};
    die Zahlen hintereinander in ein array speichern.

    Versteh ich nicht so recht: die Zahlen sind doch schon hintereinander. Wenn du das Ding wie ein 1-d-Array verwenden willst, nimm einfach einen double-Zeiger auf den Anfang. Das geht garantiert.



  • asdf



  • asdf



  • Zum Beispiel so:

    #include <stdio.h>
    
    int main(void)
    {
        double A[2][3] = {{1,2,3},{4,5,6}};
        double *zeiger = A;
        int i;
    
        for (i = 0; i < 6; i++)
            printf("zeiger[%i] -> %f\n", i, zeiger[i]);
    }
    

    Wenn ich dich richtig verstanden habe. Hier geht es um die Art und Weise, wie Arrays im Speicher angeordnet werden.

    Edit:
    Den math.h-Include hab ich rausgenommen, der war unabsichtlich hineingerutscht.



  • fredneumi schrieb:

    ich bräuchte es so: A = {1,2,3,4,5,6};

    So ist es schon im Speicher, man muss nur noch dem Compiler sagen, dass man es wie ein 1-d-Array verwenden will.



  • ok. danke. ich probiers mal 🙂



  • asdf



  • fredneumi schrieb:

    wie kann ich aber den maximal wert bestimmen. die matrix kann ja verschieden groß sein?

    Du musst wissen, wie welche Dimensionen die Matrix hat, sonst kannst du sie ja nicht anlegen. Zur Laufzeit eines C-Programmes gibt es keine Arrays mehr, weil die Elemente (wie oben gezeigt) nacheinander im Speicher abgelegt werden. Eine Information Ăźber die Dimension ist dann nicht mehr vorhanden.

    Dagegen werden zwei Techniken benutzt: 1.) man merkt sich die Dimension in irgendeiner Variable, oder 2.) man definiert einen Wert fĂźr das "Ende" der sinnvollen Daten, wie z.B. das Nullzeichen bei Zeichen-Arrays.



  • oder 3.) Man verwendet sizeof

    sizeof(A)/sizeof(**A));
    sizeof(A)/sizeof(A[0][0]));
    sizeof(A)/sizeof(double));
    


  • ergänzung schrieb:

    oder 3.) Man verwendet sizeof

    Hatte ich ganz vergessen. Dabei muss man als Anfänger aufpassen, dass man wirklich ein Array hat, und keinen Zeiger. Mich hat anfangs fein verwirrt, dass man Arrays nicht als Argumente ßbergeben kann.



  • fredneumi schrieb:

    hallo.
    ich muss aus einer Matrix : double A[2][3] = {{1,2,3},{4,5,6}};
    die Zahlen hintereinander in ein array speichern.

    Je nachdem welches Ordering (C verwendet row-major odering) erforderlich ist, reicht es einfach aus den Zeiger auf das erste Elemente zu Ăźbergeben.

    Zum Thema Ordering bitte folgenden Artikel durchlesen
    http://en.wikipedia.org/wiki/Row-major_order

    Da cBLAS column-major ordering nutzt, muß man auch zuweilen in C, das column-major ordering nutzen.



  • ~john schrieb:

    Da cBLAS...

    Bitte was?



  • mngbd schrieb:

    Bitte was?

    cBLAS ist ein Beispiel dafĂźr, weshalb man manchmal column-major ordering in C braucht.



  • ~john schrieb:

    cBLAS ist ein Beispiel dafĂźr, weshalb man manchmal column-major ordering in C braucht.

    Danke!
    🙂



  • asdf



  • fredneumi schrieb:

    super. geht gut. nun mĂźsste ich aber noch die Anzahl der Spalten auslesen. Geht das irgendwie?

    Du mußt die notwendigen Informationen immer getrennt speichern, da sie C nicht vorhält.



  • sadf



  • fredneumi schrieb:

    kann man die spaltenanzahl Ăźberhaupt speichern?

    Mit sizeof ? Das geht z.B. so:

    #include <stdio.h>
    
    #define ZEILEN (2)
    #define SPALTEN (3)
    
    int main(void)
    {
        double A[ZEILEN][SPALTEN] = {{1,2,3},{4,5,6}};
    
        printf("zeilen: %d\n", sizeof(A) / sizeof(A[0]));
        printf("spalten: %d\n", sizeof(A[0]) / sizeof(A[0][0]));
    }
    

    Das darf dich aber nicht darßber hinwegtäuschen, dass diese Zahlen schon zur Compilezeit feststehen. In diesem Sinn ist der sizeof-Operator nur eine Schreibhilfe.

    Nachtrag: in C99 mßssen diese Dimensionen nicht unbedingt zur Compilezeit bekannt sein, weil es Arrays mit variabler Länge gibt.



  • asdf


Log in to reply