繁体   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