C语言二维矩阵原地转置失败:新手求助错误原因
问题分析:原地矩阵转置失效的原因
嘿,你的问题其实很典型——你把每个对称元素交换了两次,相当于又把它们换回了原位!
咱们来拆解一下你的循环逻辑:
for(int f=0;f<3;f++) { for(int h=0;h<3;h++) { int t=A[f][h]; A[f][h]=A[h][f]; A[h][f]=t; } }
当f=0, h=1时,你交换了A[0][1]和A[1][0];但等到f=1, h=0时,你又把这两个元素交换了一次。这么一来,这两个元素等于没动!对角线的元素(比如f=h=0)交换自己和自己,也不会有任何变化。所以整个矩阵转置后和原来完全一样。
修正方案:只交换一次对称元素
要实现原地转置,你只需要处理上三角(或下三角)区域的元素,也就是只交换f < h(或h < f)的情况,避免重复操作。修改后的循环应该是这样:
for(int f=0;f<3;f++) { // 内层循环从f+1开始,只处理f < h的情况 for(int h=f+1;h<3;h++) { int t=A[f][h]; A[f][h]=A[h][f]; A[h][f]=t; } }
这样一来,每个对称元素对只会被交换一次,对角线元素完全不用碰(因为它们转置后位置不变)。
修正后的运行效果
输入同样的矩阵1 2 3 4 5 6 7 8 9,输出会变成:
Enter the numbers: 1 2 3 4 5 6 7 8 9 ------------------------------- 1 2 3 4 5 6 7 8 9 Now transposing------------------ 1 4 7 2 5 8 3 6 9
完美实现了原地转置!
内容的提问来源于stack exchange,提问作者overkill
相关产品推荐
相关产品推荐

