【问题标题】:Array of Matrices with Different sizes in CC中不同大小的矩阵数组
【发布时间】:2020-12-23 05:57:37
【问题描述】:

我正在尝试制作一个由 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]}

但是我怎样才能声明这样一个对象呢?另外我该如何为其赋值?

我正在使用 fread 从二进制文件中准备实际数据。

谢谢,

【问题讨论】:

  • 如何知道矩阵数组中每个矩阵的大小? C 中数组的所有元素都是同质的——相同的类型。这可能意味着您需要一个结构类型的数组,其中每个结构都描述其数组的形状并包含一个合适的指向数据的指针。
  • @JonathanLeffler 我在二进制文件的单独数组中拥有所有大小。我确实知道可以使用指针数组在 C 中拥有不同大小的数组数组。但我想知道如何在我的代码中将其推广到更高维度,以便拥有不同大小的矩阵数组!
  • 哦,这让生活变得微不足道——嗯,有点。你的Arrayvoid *Array[] = { ptr1, ptr2, ptr3 };(或者如果数组都是“int 数组”类型,你可以使用int *Array[] = { &ptr1[0][0], &ptr2[0][0], &ptr3[0][0] };,或者类似的。如果需要,你可以使用复合文字来创建数组。跨度>

标签: c pointers multidimensional-array size


【解决方案1】:

锯齿状数组是数组的数组,因此成员数组可以具有不同的大小,即我们可以创建一个二维数组,但每行的列数是可变的。

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

}

输出为:1

【讨论】:

  • @Ramtin 我希望这就是你要找的。​​span>
  • 在您的代码中,有很多无用的变量,如Mat1row0jagged1 等。我想在一行中声明所有这些变量。类似于int** jaggedkk[3] = {jagged1, jagged2, jagged3};
  • 我使用它们是为了让新用户更清楚。
【解决方案2】:

您可以创建一个结构来表示一个矩阵,然后创建一个该结构的数组。此外,您需要一个用于初始化矩阵的函数(即分配内存)以及一个用于删除矩阵的函数(即释放分配的内存)。

类似:

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

可能的输出:

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

【讨论】:

    【解决方案3】:

    一个“简短/简单”的解决方案可能只是写:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2017-08-18
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多