在C中使用指针转置矩阵

时间:2019-02-28 02:56:58

标签: c pointers matrix

我正在使用指针对矩阵进行转置。我的代码可以成功转置矩阵的第一行,但无法转置其他行和列。我怀疑for循环存在一些问题,但是我找不到问题所在。以下是我的代码。

void transposeMatrix(int matrix[ROWS][COLS]){
    int**  transpose=(int **)malloc(ROWS*sizeof(int*));
    for(int  i=0; i< ROWS; i++)
        transpose[i]=(int*)malloc(COLS*sizeof(int));

    for(int  i=0; i<ROWS;i++){
        puts("");
        for(int  j=0; j<COLS;j++){
            *(transpose+i*ROWS+j)= *(matrix+j*COLS+i);
            printf("%d ",transpose[j][i]);
        }
        puts("");
    }
}

矩阵生成随机数,问题看起来像这样:

Original Matrix:
10 20 30
40 50 60
70 80 90

Transpose Matrix:
10 0 43009213
20 3401401 910429
30 0 134910124

我无法附加图片,因此以上只是我所遇到问题的详细说明,实际情况并非完全一样,而是非常相似。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

*(transpose+i*ROWS+j)不是访问指针数组元素的正确方法。这样便可以访问按行优先顺序连续存储在int[]数组或通过int*指针的二维数组中。

使用*(*(transpose + i)+j)访问实现为指针数组的二维数组元素的方法。 *(transpose + i)返回指向行i的指针,将j添加到该行将返回该行中第j列的地址,并进行递归以获取或设置该值。

这也适用于声明为

的数组
int matrix[ROWS][COLS];

由于数组衰减到指针的方式。

因此您的任务行应为:

        *(*(transpose + i)+j) = *(*(matrix + j)+i);

然后,您需要更改printf()行,因为它不会打印您刚刚分配的相同元素。应该是:

        printf("%d ", transpose[i][j]);

完整的工作功能是:

void transposeMatrix(int matrix[ROWS][COLS]){
    int**  transpose=(int **)malloc(ROWS*sizeof(int*));
    for(int  i=0; i< ROWS; i++)
        transpose[i]=(int*)malloc(COLS*sizeof(int));

    for(int  i=0; i<ROWS;i++){
        puts("");
        for(int  j=0; j<COLS;j++){
            *(*(transpose + i)+j) = *(*(matrix + j)+i);
            printf("%d ",transpose[i][j]);
        }
        puts("");
    }
}

答案 1 :(得分:0)

识别每个单元格的行和列的存储位置时遇到问题 使用它们的方法如下:

i-th rows of transpose = *(transpose + i)
j-th col in i-th row of transpose  = *(*(transpose+i) + j)

类似于矩阵:

i-th rows of matrix= *(matrix + i)
j-th col in i-th row of matrix  = *(*(matrix+i) + j)

这是我的解决方法:

void transposeMatrix(int matrix[ROWS][COLS]) {
    int**  transpose = (int **)malloc(ROWS * sizeof(int*));
    for (int i = 0; i < ROWS; i++)
        transpose[i] = (int*)malloc(COLS * sizeof(int));

    for (int i = 0; i < ROWS; i++) {
        puts("");
        for (int j = 0; j < COLS; j++) {
            *(*(transpose + i) + j) = *(*(matrix + j) + i);
            printf("%d ", transpose[i][j]);
        }
        puts("");
    }
}

答案 2 :(得分:0)

您不必逐行分配新的矩阵。另外,可以进行转置和打印的功能直接传递给int *,而不是像int [3][2]等预成形数组那样传递。

甚至可以在适当位置重塑矩阵(即无需分配新空间)。如果您愿意,我可以稍后发布示例代码。

例如:

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

int M[2][3] = { {1, 2, 3}, {7, 8, 9} };
int N[3][3] = { {1, 2, 3}, { 4, 5, 6 }, {7, 8, 9} };


int *alloc_transpose(const int *matrix, size_t rows, size_t cols);
void print_matrix(const int *matrix, size_t rows, size_t cols);

int main()
{
    int *t_matrix;
    print_matrix(&M[0][0], 2, 3);
fprintf(stderr, "----\n");
    t_matrix = alloc_transpose(&M[0][0], 2, 3);
    if (t_matrix) {
        print_matrix(t_matrix, 3, 2);
    }
    free(t_matrix);
    t_matrix = alloc_transpose(&N[0][0], 3, 3);
    if (t_matrix) {
    fprintf(stderr, "----\n");
        print_matrix(t_matrix, 3, 3);
    }
    free(t_matrix);
    return 0;
}

void print_matrix(const int *matrix, size_t rows, size_t cols)
{
    size_t r, c;
    for (r = 0; r < rows; r++) {
        for (c = 0; c < cols; c++) {
            printf("%d ", *((matrix + r * cols) + c));
        }
        putchar('\n');
    }
}

int *alloc_transpose(const int *matrix, size_t rows, size_t cols)
{
    int *tm;
    int r, c;       /* relative to transposed matrix */

    tm = malloc(sizeof(int) * cols * rows); /* contiguous is okay */

    if (!tm)
        return NULL;

    for (r = 0; r < rows; r++) {
        for (c = 0; c < cols; c++) {
            *((tm + c * rows) + r) =
                          *((matrix + r * cols) + c);
        }
    }

    return tm;
}