我将如何使用数据结构使用以下代码对这些矩阵进行加法、乘法和减法?
How would I add, multiply, and subtract these Matrices with the following code using data structures?
所以,我正在编写这个程序,我得到了这组代码,并被告知要为它实现以下功能,但是我不确定如何从另一个结构构建数据结构.关于我该怎么做的任何想法?我知道如何在 C 中创建一个结构,但是我不确定如何从另一个构造一个结构。此时所有代码所做的就是读取矩阵文件并写入它。该程序实际上应该采用 2 个矩阵文件并将以下函数应用于并以相同的形式打印出来,所以我想做的是编写三个函数,在其中执行操作 return一种数据结构,其中 write_matrix 取值,return 给出答案。我已经尝试了一些想法,例如使用 read_matrix 结构来创建 multiply_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)
{
诠释我,j;
矩阵结果;
create_matrix(&result, m.rows, m.cols);
// Perform the operation
return result;
}
许多 C API 要求调用函数执行任何必要的分配并传入指向结果结构的指针。 return 值可以指示成功或失败。
int add_matrix(矩阵结果,矩阵m,矩阵n)
{
if ( / 错误检查逻辑失败 */ )
{
return-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 中创建一个结构,但是我不确定如何从另一个构造一个结构。此时所有代码所做的就是读取矩阵文件并写入它。该程序实际上应该采用 2 个矩阵文件并将以下函数应用于并以相同的形式打印出来,所以我想做的是编写三个函数,在其中执行操作 return一种数据结构,其中 write_matrix 取值,return 给出答案。我已经尝试了一些想法,例如使用 read_matrix 结构来创建 multiply_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) { 诠释我,j; 矩阵结果;
create_matrix(&result, m.rows, m.cols);
// Perform the operation
return result;
}
许多 C API 要求调用函数执行任何必要的分配并传入指向结果结构的指针。 return 值可以指示成功或失败。
int add_matrix(矩阵结果,矩阵m,矩阵n) { if ( / 错误检查逻辑失败 */ ) { return-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
。