在一维数组中转置矩阵

时间:2017-10-30 18:56:44

标签: c arrays matrix-multiplication

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

我的转置函数如下所示:

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]);
  }
}

但是给定一个数组/矩阵:

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

它返回:

1 3 4 2
2 4 3 1

所需的矩阵应如下所示:

1 2 3 4
4 3 2 1

2 个答案:

答案 0 :(得分:0)

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

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时,请检查其返回类型。如果没有分配任何东西,那么你将防止爆炸。

  • 一旦完成工作,必须释放动态分配的内存。它可以帮助您避免内存泄漏。

VLA支持可在C99,C11中获得。

答案 1 :(得分:0)

您的索引映射逻辑是正确的! 请记住,d的{​​{1}}是colSize的{​​{1}}。 因此转换矩阵的新arowSize而不是i % colSize == 0,而不是i % rowSize == 0

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

colSize

使用新值填充旧数组与您已经完成的方式没有什么不同。只需确保使用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; }