一维数组中的转置矩阵

Transposing Matrices In A 1-Dimensional Array

正在尝试创建一个在给定数组内转置矩阵的函数。

我的转置函数如下所示:

void transpose(int a[], int rowSize, int colSize){
    int d[size];
    for (int i = 0; i < rowSize; i++) {
       for (int j = 0; j < colSize; j++) {
          int index1 = i*colSize+j;
          int index2 = j*rowSize+i;

          d[index2] = a[index1];
       }
    }

    for (int i=0; i<size; i++) {
        a[i] = d[i];
    }
    for (int i = 0; i < size; i++) {
    if (i % colSize == 0) {
      printf("\n");
    }
    printf("%d ", d[i]);
  }
}

但是给定一个 array/matrix:

int c[size] = {
    1,  4,
    2,  3,
    3,  2,
    4,  1 
    };

它returns:

1 3 4 2
2 4 3 1

所需的矩阵应如下所示:

1 2 3 4
4 3 2 1

这又是同一个逻辑。在这里,如果您使用的是附加数组,那么它将类似于数组的有序遍历。

void transpose(int a[], int colSize, int rowSize) {
    /* int *d = malloc(sizeof(int)*colSize*rowSize);
    if( d == NULL){
       fprintf(stderr,"%s","Error in malloc");
       exit(1);
    }
    */
    int d[rowSize*colSize];
    int sz=0;
    for(int j=0;j<colSize;j++)
      for(int i=0;i<rowSize;i++)
        {
            d[sz++]=a[i*colSize+j];
        }
    for(int i=0;i<sz;i++)
        a[i]=d[i];
    // free(d);
}

对代码的几点评论:-

  • 每当您使用 malloc 时,请检查它是 return 类型。如果什么都不分配那么你就有防爆了

  • 工作完成后必须释放动态分配的内存。它可以避免内存泄漏。

VLA 支持在 C99、C11 中可用。

您的索引映射逻辑是正确的! 记住 dcolSizearowSize。 因此,而不是 i % colSize == 0 它应该是 i % rowSize == 0 因为转置矩阵的新 colSizerowSize.

这是假设您的参数:rowSizecolSize 是矩阵 a 的行和列大小。并且您的一维索引水平增加(沿列)。

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

// i -> j, j -> i
int index_map_transpose(int i, int j, int transposedColSize) {
    return j * transposedColSize + i;
}

int index_map(int i, int j, int colSize) {
    return i * colSize + j;
}

int *transpose(int m[], int rowSize, int colSize)
{
    int *t = malloc(rowSize * colSize * sizeof(int));
    if (t == NULL) {
        fprintf(stderr, "Memory error");
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++) {
            // Index (i, j) maps to (j, i) by defintiion of transpose

            int origional = index_map(i, j, colSize);
            int transposed = index_map_transpose(i, j, rowSize);

            t[transposed] = m[origional]; 
        }
    }

    return t;
}


void print_matrix(int m[], int rowSize, int colSize)
{
    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++) {
            if (j > 0) {
                printf(" ");
            }
            printf("%d", m[index_map(i, j, colSize)]);
        }
        printf("\n");
    }
}

int main(void)
{
    int rowSize = 4; int colSize = 2;
    int a[8] = {1, 4, 2, 3, 3, 2, 4, 1};

    print_matrix(a, rowSize, colSize);
    // Prints:
    // 1 4
    // 2 3
    // 3 2
    // 4 1

    printf("Transposing...\n");

    int *t = transpose(a, rowSize, colSize);

    print_matrix(t, colSize, rowSize);
    // Prints:
    // 1 2 3 4
    // 4 3 2 1

    // Remember to free!
    free(t);

    // Another test
    printf("Test 2\n");

    // Test with
    rowSize = 2; colSize = 3;
    int b[6] = { 3, 2, 7, 4, 9, 1 };

    print_matrix(b, rowSize, colSize);
    // Prints
    // 3 2 7
    // 4 9 1

    printf("Transposing...\n");

    t = transpose(b, rowSize, colSize);

    print_matrix(t, colSize, rowSize);
    // Result
    // 3 4
    // 2 9
    // 7 1

    free(t);

    return EXIT_SUCCESS;
}

用新值填充旧数组与您已经完成的方法没有什么不同。只需确保将 rowSize 切换为 colSize!