簡體   English   中英

C中不同大小的矩陣數組

[英]Array of Matrices with Different sizes in C

我正在嘗試制作一個由 3 個不同大小的矩陣組成的數組:

Array ={ {{1, 2, 3}, {10, 20, 30}},
         {{4, 5}, {40, 50}, {400, 500}},
         {{6, 7}, {60, 70}} };

我需要對我的代碼使用數組索引而不是指針算法。

我想我應該創建一個包含 3 個指向矩陣的指針的一維數組。 就像是:

{ *ptr1[3], *ptr2[2], *ptr3[2]}

但是我怎么能聲明這樣一個 object 呢? 另外,我該如何為其賦值?

我正在使用fread從二進制文件中准備實際數據。

謝謝,

鋸齒狀數組是 arrays 的數組,因此成員 arrays 可以具有不同的大小,即我們可以創建一個二維數組,但每行的列數是可變的。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int Mat1row0[3] = { 1, 2, 3}; 
    int Mat1row1[3] = {10, 20, 30}; 
    
    int Mat2row0[2] = {4, 5}; 
    int Mat2row1[2] = {40, 50}; 
    int Mat2row2[2] = {400, 500};
    
    int Mat3row0[2] = {6, 7}; 
    int Mat3row1[2] = {60, 70}; 
    
    
    int* jagged1[2] = {Mat1row0, Mat1row1 }; 
    int* jagged2[3] = {Mat2row0, Mat2row1, Mat2row2};
    int* jagged3[2] = {Mat3row0, Mat3row1 };
    
    int** jaggedkk[3] = {jagged1, jagged2, jagged3};

    
   printf("%d",jaggedkk[0][0][0]);

    return 0;

}

output 是:1

您可以創建一個結構來表示一個矩陣,然后創建一個該結構的數組。 此外,您需要一個 function 來初始化矩陣(即分配內存),還需要一個 function 來刪除矩陣(即空閑分配的內存)。

就像是:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    size_t rows;
    size_t columns;
    int **data;
} Matrix;

void initMatrix(size_t rows, size_t columns, Matrix *m)
{
    if (rows == 0 || columns == 0) exit(1); // error

    // Allocate row pointers
    m->data = malloc(rows * sizeof m->data[0]);
    if (m->data == NULL) exit(1); // error

    // Allocate data area, i.e. rows x columns ints
    m->data[0] = malloc(rows * columns * sizeof m->data[0][0]);
    if (m->data[0] == NULL) exit(1); // error

    // Initialize the remaining row pointers
    for (size_t i=1; i < rows; ++i)
    {
        m->data[i] = m->data[0] + i * columns;
    }

    m->rows = rows;
    m->columns = columns;
}

void deleteMatrix(Matrix *m)
{
    free(m->data[0]);
    free(m->data);
    m->rows = 0;
    m->columns = 0;
    m->data = NULL;
}

void printMatrix(Matrix *m)
{
    printf("---------------------------\n");
    printf("rows=%zu columns=%zu\n", m->rows, m->columns);
    for (size_t i=0; i < m->rows; ++i)
    {
        printf("row[%zu] at %p\t", i, (void*)m->data[i]);
        for (size_t j=0; j < m->columns; ++j)
        {
            printf("%d\t", m->data[i][j]);
        }
        printf("\n");
    }
    printf("---------------------------\n");
}

int main(void) 
{
    Matrix m[2];
    
    initMatrix(2, 5, &m[0]);
    for(size_t i=0; i < 2; ++i)
    {
        for(size_t j=0; j < 5; ++j)
        {
            m[0].data[i][j] = 10*i + j;
        }
    }
    
    initMatrix(3, 2, &m[1]);
    for(size_t i=0; i < 3; ++i)
    {
        for(size_t j=0; j < 2; ++j)
        {
            m[1].data[i][j] = 100 + 10*i + j;
        }
    }

    for(size_t i=0; i < 2; ++i)
    {
        printMatrix(&m[i]);
    }
    
    for(size_t i=0; i < 2; ++i)
    {
        deleteMatrix(&m[i]);
    }
    return 0;
}

可能的 output:

---------------------------
rows=2 columns=5
row[0] at 0x1979030 0   1   2   3   4   
row[1] at 0x1979044 10  11  12  13  14  
---------------------------
---------------------------
rows=3 columns=2
row[0] at 0x1979080 100 101 
row[1] at 0x1979088 110 111 
row[2] at 0x1979090 120 121 
---------------------------

一個“簡短/簡單”的解決方案可能只是寫:

int *** Array =(int**[]){ (int*[]){(int[]){1, 2, 3}, (int[]){10, 20, 30}},
     (int*[]){(int[]){4, 5}, (int[]){40, 50}, (int[]){400, 500}},
     (int*[]){(int[]){6, 7}, (int[]){60, 70}} };

現在 Array[0][0][0] 將是 1,Array[2][1][1] 將是 70,等等; 如果需要動態進行,可以通過以下方式進行:

int *** Array;

Array = malloc(sizeof(int**)*3);
Array[0] = malloc(sizeof(int*)*2);
Array[0][0] = malloc(sizeof(int)*3);
Array[0][0][0] = 1;
...
(and so on)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM