转置矩阵的C函数不更新矩阵

4c8rllxm  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(135)

我目前正在构建一个矩阵计算器(需要使用指针),作为我C语言入门作业的一部分,我目前正在尝试创建一个转置3x3矩阵的选项(将矩阵的行与列交换)。
然而,当我对矩阵应用函数时,它没有任何变化。
下面是转置函数的代码。

void transposeMatrix(int matrix[3][3]) {

    int row;
    int col;

    int temp = 0;
    for (row = 0; row<3; row++) {
        for (col = 0; col < 3; col++) {
            temp = *(*(matrix+row)+col);
            *(*(matrix+row)+col) = *(*(matrix+col)+row);
            *(*(matrix+col)+row) = temp;
        }
    }

}

它只是一个带有temp变量的标准交换算法。
下面是打印函数的代码

void printMatrix(char *desc,int matrix[3][3]) {

    int row;
    int column;

    printf("matriks %s:\n",desc);
    for (row = 0; row < 3; row++) {
        for (column = 0; column < 3; column++) {
            printf(" %d", matrix[row][column]);
        }

        printf("\n");
    }

}

下面是我如何调用这个函数:

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

printMatrix("before transposition", sampleM1);
transposeMatrix(sampleM1);
printMatrix("after transposition" , sampleM1);

整个操作的输出是sampleM1根本没有变化,有什么方法可以解决这个问题吗?

zysjyyx4

zysjyyx41#

正如上面提到的@TomKarzes,您访问了矩阵的同一个索引两次,并通过在行+ 1开始内部循环来避免这种情况。您提到您需要使用指针语法,这很好,swap()现在将丑陋的地方(参数)本地化。

#include <stdint.h>
#include <stdio.h>

#define N 3

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void printMatrix(int matrix[N][N]) {
    for (uint8_t row = 0; row < N; row++)
        for (uint8_t col = 0; col < N; col++)
            printf("%d%s", matrix[row][col], col + 1 < N ? ", " : "\n");
}

void transposeMatrix(int matrix[N][N]) {
    for (uint8_t row = 0; row < N; row++)
        for (uint8_t col = row + 1; col < N; col++)
            swap(&matrix[row][col], &matrix[col][row]);
}

int main() {
    int matrix[N][N] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    printMatrix(matrix);
    transposeMatrix(matrix);
    printMatrix(matrix);
}

下面是上面的输出:

1, 2, 3
4, 5, 6
7, 8, 9
1, 4, 7
2, 5, 8
3, 6, 9

相关问题