自定义矩阵转置函数仅支持方阵,非方阵输出异常求助
矩阵转置函数非方阵处理错误的修复
问题说明
编写的矩阵转置函数仅在处理方阵时运行正常,处理2×3、5×7这类非方阵时,转置结果完全错误。输入函数返回存储输入值的新数组,转置函数创建与原矩阵尺寸相同的新数组,但非方阵场景下元素位置错乱。
原代码
#include <stdio.h> #include <locale.h> #include <math.h> float *enterArr (int m, int n, char name); void showArr(float *M, int m, int n, char name); float *transp(float *M, int m, int n); int main() { float *A, *B, *P, *Q; int ma, na, mb, nb; printf("Enter size of %c matrix : ", 'A'); scanf("%i %i", &ma, &na); printf("Enter size of %c matrix : ", 'B'); scanf("%i %i", &mb, &nb); if (ma == 0 || na == 0 || mb == 0 || nb == 0) puts("You have entered invalid values"); else { A = enterArr(ma, na, 'A'); B = enterArr(mb, nb, 'B'); showArr(A, ma, na, 'A'); showArr(B, mb, nb, 'B'); P = transp(A, ma, na); Q = transp(B, mb, nb); puts("Transposed matrix: "); showArr(P, na, ma, 'P'); showArr(Q, nb, mb, 'Q'); } fflush(stdin); getchar(); return (0); } float *transp (float *M, int m, int n) { int i, j, mm; float *tr; mm = m*n; tr = new float[mm]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) tr[i*n+j] = M[i+j*n]; return tr; } void showArr(float *M, int m, int n, char name) { int i, j; printf("Maxtrix %c: \n", name); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%9.4f", M[i*n+j]); printf("\n"); } printf("\n"); } float *enterArr (int m, int n, char name) { int i, j, mm; float *M; mm=m*n; M = new float [mm]; printf("Enter elements of %c matrix\n", name); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%f", &M[i*n+j]); } } return M; }
错误根源
转置函数的索引计算逻辑错误:
- 原矩阵是m行n列,行优先存储,原矩阵第i行第j列的元素索引为
i*n + j(这部分正确)。 - 转置后的矩阵应为n行m列,行优先存储时,转置矩阵第j行第i列(对应原矩阵第i行第j列)的元素索引应该是
j*m + i。 - 原代码错误使用
i*n + j作为转置矩阵的索引,只有当m=n(方阵)时,i*n+j和j*m+i等价,所以方阵能正常运行;非方阵时,索引计算完全错误,导致元素位置错乱。
修正后的转置函数
float *transp (float *M, int m, int n) { int i, j, mm; float *tr; mm = m*n; tr = new float[mm]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) // 修正索引计算:转置矩阵是n行m列,用j*m+i定位元素 tr[j*m + i] = M[i*n + j]; return tr; }
补充说明
- 代码中使用了C++的
new进行动态内存分配,若需兼容C语言,可替换为malloc,并记得在程序结束时用free释放内存(避免内存泄漏)。 - 原代码中的
or是C++关键字,C语言中需替换为||,已在代码示例中修正。
内容的提问来源于stack exchange,提问作者woolMe
相关产品推荐
相关产品推荐

