【问题标题】:Transpose a matrix in C [closed]在C中转置矩阵[关闭]
【发布时间】:2016-06-06 17:33:03
【问题描述】:

我需要写一个程序,在C中转置一个矩阵。需要转置的矩阵,是一个一维数组,数组A:

void fill_array_A(char *arrayA, int ssize)
{
    int i;
    for(i=0; i<ssize; i++)
    {
        printf("Letter %d:\n> ", (i+1));
        scanf(" %c", &arrayA[i]);
    }
}

void show_array_A(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j=0;

    for(i=0; i<ssize; i++)
    {
        printf("valueA[%d] = %c ", i, arrayA[i]);

        j ++;

        if(j == n)
        {
            printf("\n");
            j = 0;
        }
    }
}

valueA[0] = a valueA[1] = a valueA[2] = a 
valueA[3] = b valueA[4] = b valueA[5] = b 
valueA[6] = c valueA[7] = c valueA[8] = c 

我需要将矩阵 A 转置为矩阵 B,所以 B = A(T)。 B 是一个二维数组,其中 B 存储指向数组 A 中元素的指针。但是,我的代码显示错误的结果,而不是

valueB[0] = a valueB[3] = b valueB[6] = c 
valueB[1] = a valueB[4] = b valueB[7] = c 
valueB[2] = a valueB[5] = b valueB[8] = c

我的代码给了我:

valueB[0] = a valueB[1] = b valueB[2] = b 
valueB[3] = a valueB[4] = b valueB[5] = b 
valueB[6] = a valueB[7] = b valueB[8] = b 

问题出在哪里?这是整个代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char* create_array_A(int ssize)
{
    char *arrayA = malloc(sizeof(char) * ssize);
    return arrayA;
}

void fill_array_A(char *arrayA, int ssize)
{
    int i;
    for(i=0; i<ssize; i++)
    {
        printf("Letter %d:\n> ", (i+1));
        scanf(" %c", &arrayA[i]);
    }
}

void show_array_A(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j=0;

    for(i=0; i<ssize; i++)
    {
        printf("valueA[%d] = %c ", i, arrayA[i]);

        j ++;

        if(j == n)
        {
            printf("\n");
            j = 0;
        }
    }
}

char** create_array_B(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j;

    char **arrayB = malloc(sizeof(char*) * n);

    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            arrayB[j] = &arrayA[i];
        }
    }
    return arrayB;
}

void show_array_B(char** arrayB, int n, int m)
{
    int i,j,k=0;

    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            printf("valueB[%d] = %c ", k, arrayB[i][j]);
            k ++;
        }
        printf("\n");
    }
}

int main(int argc, char **argv)
{
    int n = 9;

    char *arrayA = create_array_A(n);
    fill_array_A(arrayA, n);
    show_array_A(arrayA, n);

    printf("\n");

    char **arrayB = create_array_B(arrayA, n);
    show_array_B(arrayB, sqrt(n), sqrt(n));

    return 0;
}

【问题讨论】:

  • 矩阵通常是二维数组。 “向量”的转置非常没用,只是根据它们的用法对它们进行不同的解释。而char ** 绝不是二维数组!指针不是数组。

标签: c arrays pointers math matrix


【解决方案1】:

您的代码中有几个最明显的错误是创建数组 B。试试这个方法:

char** create_array_B(char *arrayA, int ssize)
{
    int n = sqrt(ssize);
    int i,j;

    char **arrayB = malloc(sizeof(char*) * ssize);
    //                                      ^^^
    if (arrayB == NULL)
        // handle error
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
            arrayB[i * n + j] = &arrayA[j * n + i];
            //     ^^^^^^^^^            ^^^^^^^^^^
    }
    return arrayB;
}

其他错误包括元素打印、错误大小的内存分配以及释放/释放 malloced 内存丢失。

可以在here找到完整的解决方案。

现在一切都很好。使用 valgrind 在上面运行:

p@:/matrix_transp$ valgrind --leak-check=yes --leak-check=full --show-leak-kinds=all ./executable 
==30322== Memcheck, a memory error detector
==30322== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==30322== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==30322== Command: ./executable
==30322== 
valueA[0] = 0 valueA[1] = 1 valueA[2] = 2 
valueA[3] = 3 valueA[4] = 4 valueA[5] = 5 
valueA[6] = 6 valueA[7] = 7 valueA[8] = 8 

valueB[0] = 0 valueB[1] = 3 valueB[2] = 6 
valueB[3] = 1 valueB[4] = 4 valueB[5] = 7 
valueB[6] = 2 valueB[7] = 5 valueB[8] = 8 
==30322== 
==30322== HEAP SUMMARY:
==30322==     in use at exit: 0 bytes in 0 blocks
==30322==   total heap usage: 2 allocs, 2 frees, 81 bytes allocated
==30322== 
==30322== All heap blocks were freed -- no leaks are possible
==30322== 
==30322== For counts of detected and suppressed errors, rerun with: -v
==30322== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

【讨论】:

  • 好的,非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多