You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义矩阵转置函数仅支持方阵,非方阵输出异常求助

矩阵转置函数非方阵处理错误的修复

问题说明

编写的矩阵转置函数仅在处理方阵时运行正常,处理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;
}

补充说明

  1. 代码中使用了C++的new进行动态内存分配,若需兼容C语言,可替换为malloc,并记得在程序结束时用free释放内存(避免内存泄漏)。
  2. 原代码中的or是C++关键字,C语言中需替换为||,已在代码示例中修正。

内容的提问来源于stack exchange,提问作者woolMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:53:21