c - 如何使用数据结构通过以下代码对这些矩阵进行加、乘和减?

标签 c matrix data-structures

所以,我正在编写这个程序,我得到了这组代码并被告知要对其实现以下功能,但是我不确定如何从另一个结构构造数据结构。关于我该怎么做有什么想法吗?我知道如何在 C 中创建一个结构,但是如何构建另一个结构,我不确定。此时所有代码所做的就是读取矩阵文件并将其写入。该程序实际上应该采用 2 个矩阵文件,并应用以下函数并以相同的形式打印出来,所以我想做的是编写三个函数,在其中执行操作并返回数据结构write_matrix 接受并返回答案。我尝试了一些想法,例如使用 read_matrix sruct 创建一个 multip_matrix 结构函数,但是没有成功。有什么想法吗?

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

struct matrix
{
    int rows;
    int cols;
    int **data;
};

FILE *
input_from_args(int argc, const char *argv[])
{
    if (argc == 1) {
        return stdin;
    } else {
        return fopen(argv[1], "r");
    }
}


struct matrix
read_matrix(FILE *src)
{
    struct matrix m;
    int i, j;

    fscanf(src, "%d", &m.rows);

    fscanf(src, "%d", &m.cols);

    m.data = (int **)malloc(m.rows * sizeof(int *));
    for (i = 0; i < m.cols; i++) {
        m.data[i] = (int *)malloc(m.cols * sizeof(int));
    }

    for (i = 0; i < m.rows; i++) {
        for (j = 0; j < m.cols; j++) {
            fscanf(src, "%d", &m.data[i][j]);
        }
    }

    return m;
}


void
write_matrix(FILE *dest, struct matrix m)
{
    int i, j;

    fprintf(dest, "%d\n", m.rows);
    fprintf(dest, "%d\n", m.cols);

    for (i = 0; i < m.rows; i++) {
        for (j = 0; j < m.cols; j++) {
            fprintf(dest, "%d\t", m.data[i][j]);
        }

        fprintf(dest, "\n");
    }
}

void
clear_matrix(struct matrix m)
{
    int i;

    for (i = 0; i < m.rows; i++) {
        free(m.data[i]);
    }

    free(m.data);
}

int
main(int argc, const char *argv[])
{
    FILE *src = input_from_args(argc, argv);
    FILE *dest = stdout;
    struct matrix m;
    for (i = 1; i < argc; i++)
    {
        if (src == NULL) {
            fprintf(stderr, "%s: unable to open %s\n", argv[0], argv[1]);
            exit(EXIT_FAILURE);
        }else{
            m = read_matrix(src);
            fclose(src);
            write_matrix(dest, m);
        }
        clear_matrix(m);
    }
    return EXIT_SUCCESS;
}

最佳答案

我认为主要问题是将矩阵分配与设置值分开。目前,内存分配仅发生在从文件读取的上下文中,但这不允许您根据计算分配矩阵。

我的解决方案是编写一个仅执行矩阵分配的函数。重写 read_matrix 来调用它,以便分配代码全部集中在一个位置,以防您以后需要更改某些内容。然后在矩阵运算函数中调用分配函数。

可能的分配函数:

typedef struct matrix matrix;

void
create_matrix(matrix *m, int rows, int cols)
{
    int i;
    m->rows = rows;
    m->cols = cols;
    m->data = malloc(m->rows * sizeof(int *));
    for (i = 0; i < m->rows; i++) {
        m->data[i] = malloc(m->cols * sizeof(int));
    }
}

请注意,我传入了一个指向矩阵结构的指针,以便对该结构的操作实际上会影响传入的变量,而不是在本地副本上进行操作。这是使用它的重写的 read_matrix 函数:

matrix
read_matrix(FILE *src)
{
    matrix m;
    int i, j, *row;

    fscanf(src, "%d", &m.rows);
    fscanf(src, "%d", &m.cols);

    create_matrix(&m, m.rows, m.cols);

    for (i = 0; i < m.rows; i++) {
        row = m.data[i];
        for (j = 0; j < m.cols; j++) {
            fscanf(src, "%d", &row[j]);
        }
    }

    return m;
}

现在您可以在函数内分配结果矩阵:

矩阵 add_matrix(矩阵 m, 矩阵 n) { 整数 i,j; 矩阵结果;

    create_matrix(&result, m.rows, m.cols);

    // Perform the operation

    return result;
}

许多 C API 要求调用函数执行任何必要的分配并传入指向结果结构的指针。成功或失败可以通过返回值来指示。

int add_matrix(矩阵 结果, 矩阵 m, 矩阵 n) { if (/ 错误检查逻辑失败 */) { 返回-1; }

    // Perform operation

    return 0;
}

然后可以像这样使用:

matrix result;
create_matrix(&result, result_rows, result_cols);
int error = add_matrix(&result, m, n);
if (error = -1)
{
    // Handle error
}

// Etc...

第二个版本的好处是矩阵库的用户知道他们负责在最后调用 clear_matrix

关于c - 如何使用数据结构通过以下代码对这些矩阵进行加、乘和减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550520/

相关文章:

C程序创建不编译的管道数组

JavaScript/ typescript : Created Doubly-Sorted Tree from List

c# - 几乎正确的矩阵分解代码在否定情况下失败

c - 矩阵声明上的 SIGSEGV

java - 是否可以在事先不知道输入大小的情况下实现堆?

java - 从未排序的数组中找出两个这样的元素,它们在不对数组进行排序的情况下具有最小差异

C2061语法错误标识符 'wait'由非法声明引起?

c,函数参数的运行时缓冲区大小

c - 类型定义一个枚举类型作为结构

python - 3维矩阵加法