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

使用C语言结构体获取正确矩阵转置的代码问题排查求助

稀疏矩阵转置函数调用失败排查

我编写了一个程序,通过结构体term实现矩阵转置,但无法得到正确结果。编译无错误,反复检查transpose函数逻辑未发现问题,调用函数后转置矩阵输出乱码值。以下是完整代码、实际输出与预期结果:

完整代码

结构体定义

#include <stdio.h>

typedef struct
{
    int row;
    int col;
    int value;
} term;

转置函数

void transpose(term a[], term b[])
{
    int n, currentb;
    n = a[0].value; // 非零元素总数
    b[0].row = a[0].col; // 转置矩阵行数 = 原矩阵列数
    b[0].col = a[0].row; // 转置矩阵列数 = 原矩阵行数
    b[0].value = n;

    if (n > 0) // 非零矩阵处理
    {
        currentb = 1;
        for (int i = 0; i < a[0].col; i++) // 遍历原矩阵每一列
        {
            for (int j = 1; j <= n; j++) // 遍历所有非零元素
            {
                if (a[j].col == i)
                {
                    // 将当前列元素存入转置矩阵
                    b[currentb].row = a[j].col;
                    b[currentb].col = a[j].row;
                    b[currentb].value = a[j].value;
                    currentb++;
                }
            }
        }
    }
}

主函数

int main()
{
    term a[3] = { {1,2,3}, {4,5,6}, {7,8,9} };
    term b[3];

    // 输出原矩阵
    printf("original matrix\n");
    for (int i = 0; i < 3; i++)
    {
        printf(" %d %d %d\n", a[i].row, a[i].col, a[i].value);
    }
    printf("\n\n");
    
    // 调用转置函数(此处错误)
    void transpose(term a[], term b[]);
    
    // 输出转置矩阵
    printf("transpose matrix\n");
    for (int i = 0; i < 3; i++)
    {
        printf(" %d %d %d\n", b[i].row, b[i].col, b[i].value);
    }

    return 0;
}

实际输出

original matrix
 1 2 3
 4 5 6
 7 8 9

transpose matrix
 -858993460 -858993460 -858993460
 -858993460 -858993460 -858993460
 -858993460 -858993460 -858993460

预期输出

original matrix
 1 2 3
 4 5 6
 7 8 9
    
transpose matrix
 1 4 7
 2 5 8
 3 6 9

错误分析与修正

1. 未真正调用转置函数

主函数中void transpose(term a[], term b[]);是函数声明,不是函数调用。正确的调用方式是:

transpose(a, b);

2. 稀疏矩阵存储格式错误

你的transpose函数是针对稀疏矩阵的三元组存储格式设计的:

  • a[0]存储矩阵的总行数、总列数、非零元素总数
  • a[1]到a[n]存储每个非零元素的行号、列号、值

但你初始化的a数组是把每个元素当成普通矩阵的一行,完全不符合函数预期格式。

修正后的完整代码

如果要实现普通3元素矩阵的转置,需要调整逻辑;如果坚持用稀疏矩阵格式,正确代码如下:

#include <stdio.h>

typedef struct
{
    int row;
    int col;
    int value;
} term;

void transpose(term a[], term b[])
{
    int n, currentb;
    n = a[0].value;
    b[0].row = a[0].col;
    b[0].col = a[0].row;
    b[0].value = n;

    if (n > 0)
    {
        currentb = 1;
        for (int i = 0; i < a[0].col; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (a[j].col == i)
                {
                    b[currentb].row = a[j].col;
                    b[currentb].col = a[j].row;
                    b[currentb].value = a[j].value;
                    currentb++;
                }
            }
        }
    }
}

int main()
{
    // 稀疏矩阵三元组格式:a[0]=(行数,列数,非零元素数),后续为每个元素的(行,列,值)
    // 对应原矩阵:
    // 1 4
    // 2 5
    // 3 6
    term a[7] = { {3,2,6}, {0,0,1}, {0,1,4}, {1,0,2}, {1,1,5}, {2,0,3}, {2,1,6} };
    term b[7];

    printf("original sparse matrix (三元组格式)\n");
    for (int i = 0; i <= a[0].value; i++)
    {
        printf(" %d %d %d\n", a[i].row, a[i].col, a[i].value);
    }
    printf("\n\n");
    
    // 正确调用转置函数
    transpose(a, b);
    
    printf("transposed sparse matrix (三元组格式)\n");
    for (int i = 0; i <= b[0].value; i++)
    {
        printf(" %d %d %d\n", b[i].row, b[i].col, b[i].value);
    }

    return 0;
}

如果要实现普通矩阵的转置,需重新设计逻辑,比如直接用二维数组或调整结构体存储方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:25:01