矩阵的简单过渡但出了什么问题?

时间:2015-01-23 13:13:42

标签: c

#include <stdio.h>

main(){
    int A[3][2] = {0} ;

    printf("A = \n");   
    for(int x = 0 ; x < 3 ; x++){
        for (int y = 0 ; y < 2 ; y ++){
            A[x][y] = (x+1)*1 + (x*1+3)*y ; 
            printf("A[%d][%d] = %d ", x , y ,A[x][y]);
        }
        printf("\n");
    }   
    printf("\nAT = \n");    
    for (int p = 0 ; p < 2 ; p++){
        for (int q = 0 ; q < 3 ; q++){
            A[p][q] = A[q][p];
            printf("A[%d][%d] = %d ", p ,q , A[p][q]);
        }
        printf("\n");
    }
}

为什么AT [1] [0] = 2而不是4?

我已经为这个简单的问题测试了一个小时,但我不知道。

2 个答案:

答案 0 :(得分:2)

如果转置非方矩阵,则生成矩阵的尺寸也将被转置。不仅如此,如果你要在原地进行转置,你需要交换元素对,否则你会在它们被转置之前覆盖一些元素。

因此,要解决这两个问题,您应该只使用第二个矩阵,其中包含转置结果的正确尺寸,例如

#include <stdio.h>

int main()
{
    int A[3][2] = {0};
    int AT[2][3] = {0};  // <<<

    printf("A = \n");   
    for(int x = 0 ; x < 3 ; x++){
        for (int y = 0 ; y < 2 ; y ++){
            A[x][y] = (x+1)*1 + (x*1+3)*y ; 
            printf("A[%d][%d] = %d ", x, y, A[x][y]);
        }
        printf("\n");
    }   
    printf("\nAT = \n");    
    for (int p = 0 ; p < 2 ; p++){
        for (int q = 0 ; q < 3 ; q++){
            AT[p][q] = A[q][p]; // <<<
            printf("A[%d][%d] = %d ", p, q, AT[p][q]);
        }
        printf("\n");
    }
    return 0;
}

LIVE DEMO

答案 1 :(得分:0)

当条件到来时,你正在访问数组越界,

 A[0][2]=A[2][0]; // <--

此处您只能访问第一个位置。就像Paul R所说的那样使用 转置数组时单独的数组。

例如,考虑你的数组是在内存中声明的。

Memory Address     125    126     127     128     129     130
                    ^      ^       ^       ^       ^       ^
                    |      |       |       |       |       |
Array accessing  [0][0]  [0][1]  [1][0]  [1][1]  [2][0]  [2][1]

访问[0][2]时会发生什么。它将转到[1][0]