C语言矩阵转置代码行数大于列数时输出错误问题求解
C语言矩阵转置代码错误排查与修复
核心错误点
- 转置矩阵索引计算错误:转置后矩阵的维度是「原矩阵列数为行、原矩阵行数为列」,
target的偏移量计算误用了原矩阵列数column作为行步长,应该用原矩阵行数row作为转置矩阵的行步长。 - 输出逻辑错误:main函数中输出用的
m、n未定义,输出偏移量计算错误,且循环边界和转置后的矩阵维度不匹配。 - 函数前置声明缺失:
transpose函数定义在main之后,调用前没有声明会触发编译警告。
错误原因说明
以异常测试用例为例:3行2列的原矩阵转置后应为2行3列。原代码中target[j * column + i]的column值为2,当j=0、i=2时偏移量为0*2+2=2,存入值5;后续j=1、i=0时偏移量为1*2+0=2,直接把之前存入的5覆盖,就出现了错误输出里重复的5。
修复后完整代码
#include <stdio.h> #include <stdlib.h> // transpose函数前置声明 void transpose(int row, int column, int* target, int* image); int main() { int row, column, tmp; scanf("%d", &row); scanf("%d", &column); int *image = (int*)malloc(sizeof(int) * row * column); int *target = (int*)malloc(sizeof(int) * row * column); for(int i = 0; i < row; i++) { for(int j = 0; j < column; j++) { scanf("%d", &tmp); image[i * column + j] = tmp; } } transpose(row, column, target, image); // 转置后为column行row列,调整循环边界 for (int i = 0; i < column; i++) { for (int j = 0; j < row; j++) { // 转置后每行有row个元素,步长改为row printf("%d\t", target[i * row + j]); } printf("\n"); } // 释放动态申请的内存 free(image); free(target); return 0; } void transpose(int row, int column, int* target, int* image) { for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { // 转置后第j行第i列的偏移为 j * 转置后列数(row) + i target[j * row + i] = image[i * column + j]; } } }
内容的提问来源于stack exchange,提问作者jad egbaria
相关产品推荐
相关产品推荐

