求助 一道关于矩阵运算的题

mrjia 2008-02-17 06:00:05
Write a program to read in two floating point matrices A and B, which are of dimensions specified by the
user. Dynamically allocate space for both input matrices.

Implement 3 matrix operators: add, subtract and multiply, each of which should be implemented as a
function using call by reference. Devise appropriate tests within each function to determine whether the
operator is valid for the dimensions specified - if not, an error should be printed.

Full credit will only be given for solutions that follow the specification, but also where each part of the
program has been thoroughly tested, both with valid and invalid data. Use appropriate error messages
whenever the user enters invalid data.

Hint: You need to devise a suitable structure to store the dimensions and the data of each matrix. The
function call, for example, to multiply A and B together should be as simple as
multiply_matrix(A, B)
where A and B are structures (or pointers to structures). You may choose simply to print out the result on
the screen, or store the result in a matrix C with a separate print_matrix function.

上面这个是题目 就是让编个程序 能算2个矩阵的加减法和乘法

老师要让用结构来表示矩阵a和b 好像还要用到malloc什么的 哎 我c学的太差了TT

我想 是不是得弄3个函数来表示加 减和 乘法运算 然后 弄成下面这种样子- -
int main (void)
{
int opt;
printf("1-Enter matrices A & B\n2-Add matrices\n3-Subtract matrices\n4-Multiply matrices\n5-Quit program\n");
scanf("%d",&opt);
while(opt=1)
{....}
while(opt=2)
{....}
......

return 0;
}
最后的效果 应该是这样
1-enter matrices A & B
2-add matrices
3-subtract matrices
4-multiply matrices
5-quit program


option 1

number of rows in A: 2
number of columns in A: 3
Enter matrix data:
1 2 3
3 4 5


number of rows in B: 2
number of columns in B: 3
Enter matrix data:
4 3 2
2 1 0

1-enter matrices A & B
2-add matrices
3-subtract matrices
4-multiply matrices
5-quit program

option:2
A+B=
5.0 5.0 5.0
5.0 5.0 5.0


1-enter matrices A & B
2-add matrices
3-subtract matrices
4-multiply matrices
5-quit program

option: 3

A-B=
-3.0 -1.0 1.0
1.0 3.0 5.0

1-enter matrices A & B
2-add matrices
3-subtract matrices
4-multiply matrices
5-quit program
........
...全文
190 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
baihacker 2008-02-20
  • 打赏
  • 举报
回复
全班第一非我莫属了 - -

目标不应该仅限于此
mrjia 2008-02-20
  • 打赏
  • 举报
回复
哦也 谢谢师傅了 ^^

太好了 最近几次作业有师傅帮助 全班第一非我莫属了 - -
mrjia 2008-02-20
  • 打赏
  • 举报
回复
-.-其实我的目标是考剑桥 不过说了没人信 所以 就改成全班第一了
星羽 2008-02-19
  • 打赏
  • 举报
回复

input matrix 1
enter dimensions : 2,4
enter 00 : 1
enter 01 : 1
enter 02 : 1
enter 03 : 1
enter 10 : 2
enter 11 : 2
enter 12 : 2
enter 13 : 2

matrix 1 :
1.00 1.00 1.00 1.00
2.00 2.00 2.00 2.00

init matrix 2
enter dimensions : 4,2
enter 00 : 1
enter 01 : 1
enter 10 : 2
enter 11 : 2
enter 20 : 3
enter 21 : 3
enter 30 : 4
enter 31 : 4

matrix 2 :
1.00 1.00
2.00 2.00
3.00 3.00
4.00 4.00

matrix 1 + matrix 2 =
no resault
matrix 1 - matrix 2 =
no resault
matrix 1 * matrix 2 =
10.00 10.00
20.00 20.00

请按任意键继续. . .
星羽 2008-02-19
  • 打赏
  • 举报
回复

改了下,程序太乱了,你看着改吧,只给你参考的
return 0 表示错误(main除外)
return 1 表示正确

#include "stdio.h"

typedef struct {
float** datas;
int dim_x;
int dim_y;
} matrix;

void release_matrix(matrix* mat){
int i;
if (!mat)
return;
if (mat->datas) {
for (i = 0; i < mat->dim_x; ++i)
if (mat->datas[i])
free(mat->datas[i]);
free(mat->datas);
}
}

int input_matrix(matrix* mat) {
int i;
int j;
if (!mat)
return 0;
release_matrix(mat);
printf("enter dimensions : ");
scanf("%d,%d", &mat->dim_x, &mat->dim_y);
if (mat->dim_x <= 0 || mat->dim_y <= 0)
return 0;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j) {
printf("enter %d%d : ", i, j);
scanf("%f", &mat->datas[i][j]);
}
return 1;
}

void print_matrix(matrix* mat) {
int i;
int j;
for (i = 0; i < mat->dim_x; ++i)
{
for (j = 0; j < mat->dim_y; ++j)
printf("%.2f ", mat->datas[i][j]);
printf("\n");
}
}

int add(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
release_matrix(mat);
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] + m2->datas[i][j];
return 1;
}

int sub(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
release_matrix(mat);
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] - m2->datas[i][j];
return 1;
}

int mul(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
int n;
if (!mat || !m1 || !m2)
return 0;
release_matrix(mat);
if (m1->dim_x != m2->dim_y || m1->dim_y != m2-> dim_x)
return 0;
mat->dim_x = m1-> dim_x;
mat->dim_y = m2-> dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i) {
for (j = 0; j < mat->dim_y; ++j) {
mat->datas[i][j] = 0;
for(n = 0; n < m1->dim_y; ++n){
mat->datas[i][j] += m1->datas[i][n] * m2->datas[n][j];
}
}
}

}
int main()
{
matrix m1;
matrix m2;
matrix ms;

memset(&m1, 0, sizeof(m1));
memset(&m2, 0, sizeof(m2));
memset(&ms, 0, sizeof(ms));

printf("input matrix 1\n");
input_matrix(&m1);
printf("\n");
printf("matrix 1 : \n");
print_matrix(&m1);
printf("\n");

printf("init matrix 2\n");
input_matrix(&m2);
printf("\n");
printf("matrix 2 : \n");
print_matrix(&m2);
printf("\n");

printf("matrix 1 + matrix 2 = \n");
if (add(&ms, &m1, &m2)) {
print_matrix(&ms);
printf("\n");
} else {
printf("no resault\n");
}

printf("matrix 1 - matrix 2 = \n");
if (sub(&ms, &m1, &m2)) {
print_matrix(&ms);
printf("\n");
} else {
printf("no resault\n");
}

printf("matrix 1 * matrix 2 = \n");
if (mul(&ms, &m1, &m2)) {
print_matrix(&ms);
printf("\n");
} else {
printf("no resault\n");
}

release_matrix(&m1);
release_matrix(&m2);
release_matrix(&ms);
}


mrjia 2008-02-19
  • 打赏
  • 举报
回复
哇师傅太厉害了

能给我说下为什么要在乘法里面写mat->datas[i][j] = 0;而加减法里面不用吗?

还有乘法里面等号前面为什么有个+ ?

还有return 1 有什么用处? 我们教材里面 貌似所有例子都是return 0

还有 非常感谢o(∩_∩)o...
mrjia 2008-02-19
  • 打赏
  • 举报
回复
初始化在6楼那个里面 好像已经初始化了

能详细说说吗?我太笨了 TT

矩阵相乘 比如
a b x y
c d 乘 m n

结果应该是 ax+bm ay+bn
cx+dm cy+dn

那应该怎么表示呢?
星羽 2008-02-19
  • 打赏
  • 举报
回复

#include "stdafx.h"

#include "stdio.h"

typedef struct {
float** datas;
int dim_x;
int dim_y;
} matrix;

int init_matrix(matrix* mat) {
int i;
int j;
if (!mat)
return 0;
printf("enter dimensions : ");
scanf("%d,%d", &mat->dim_x, &mat->dim_y);
if (mat->dim_x <= 0 || mat->dim_y <= 0)
return 0;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j) {
printf("enter %d%d : ", i, j);
scanf("%f", &mat->datas[i][j]);
}
return 1;
}

void release_matrix(matrix* mat){
int i;
if (!mat)
return;
for (i = 0; i < mat->dim_x; ++i)
free(mat->datas[i]);
free(mat->datas);
}

void print_matrix(matrix* mat) {
int i;
int j;
for (i = 0; i < mat->dim_x; ++i)
{
for (j = 0; j < mat->dim_y; ++j)
printf("%.2f ", mat->datas[i][j]);
printf("\n");
}
}

int add(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] + m2->datas[i][j];
return 1;
}

int sub(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] - m2->datas[i][j];
return 1;
}

int mul(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
int n;
if (!mat || !m1 || !m2)
return 0;
if (m1->dim_x != m2->dim_y || m1->dim_y != m2-> dim_x)
return 0;
mat->dim_x = m1-> dim_x;
mat->dim_y = m2-> dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i) {
for (j = 0; j < mat->dim_y; ++j) {
mat->datas[i][j] = 0;
for(n = 0; n < mat->dim_y; ++n){
mat->datas[i][j] += m1->datas[i][n] * m2->datas[n][j];
}
}
}
return 1;
}
int main()
{
matrix m1;
matrix m2;
matrix m;
printf("init matrix 1\n");
init_matrix(&m1);
printf("\n");
printf("matrix 1 : \n");
print_matrix(&m1);
printf("init matrix 2\n");
printf("\n");
init_matrix(&m2);
printf("\n");
printf("matrix 2 : \n");
print_matrix(&m2);
printf("\n");
printf("matrix 1 + matrix 2 = : \n");
add(&m, &m1, &m2);
print_matrix(&m);
printf("\n");
printf("matrix 1 - matrix 2 = : \n");
release_matrix(&m);
sub(&m, &m1, &m2);
print_matrix(&m);
printf("\n");
printf("matrix 1 * matrix 2 = : \n");
release_matrix(&m);
mul(&m, &m1, &m2);
print_matrix(&m);
release_matrix(&m);
release_matrix(&m1);
release_matrix(&m2);
}

ltc_mouse 2008-02-19
  • 打赏
  • 举报
回复
mat-> datas[i][j]在使用前没有初始化,可能是随机数值

另外,矩阵相乘的结果维数,有点逻辑问题
baihacker 2008-02-19
  • 打赏
  • 举报
回复
今天刚研究了一个库的一部分.....
blitz
mrjia 2008-02-19
  • 打赏
  • 举报
回复
师傅 我写了两个矩阵相乘的函数 不过运行 得出的 好像是地址值 你能帮我看下吗?

int multiply(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
int n;
if (m1->dim_x != m2->dim_y || m1->dim_y != m2->dim_x)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i){
for (j = 0; j < mat->dim_y; ++j) {
for(n=0;n<mat->dim_y;++n){
mat->datas[i][j]+= m1->datas[i][n] * m2->datas[n][j];
}
}

}

return 1;
}
mrjia 2008-02-17
  • 打赏
  • 举报
回复
ls的可以详细说明一下吗? 我c实在是学的有点不好......
csdn5211 2008-02-17
  • 打赏
  • 举报
回复
先确定输入和输出的形式,数据存放的形式,然后确定计算方法,然后就用c一行行写,而不是先想着什么得用while得用malloc。
mrjia 2008-02-17
  • 打赏
  • 举报
回复
哇 星羽大人终于来了

- -我完全不知道该怎么做

只能想到个写3个关于加减法的函数 然后用while语句把那些弄进去

while语句好些 可是函数我不会写 那个结构 我也不太会。。。。。

><

int main (void)
{
int opt;
printf("1-Enter matrices A & B\n2-Add matrices\n3-Subtract matrices\n4-Multiply matrices\n5-Quit program\n");
scanf("%d",&opt);
while(opt=1)
{....}
while(opt=2)
{....}
......

return 0;
}

星羽 2008-02-17
  • 打赏
  • 举报
回复
你的问题是?
星羽 2008-02-17
  • 打赏
  • 举报
回复

运行

init matrix 1
enter dimensions : 2,2
enter 00 : 1
enter 01 : 1
enter 10 : 1
enter 11 : 1

matrix 1 :
1.00 1.00
1.00 1.00
init matrix 2

enter dimensions : 2,2
enter 00 : 2
enter 01 : 2
enter 10 : 2
enter 11 : 2

matrix 2 :
2.00 2.00
2.00 2.00

matrix 1 + matrix 2 = :
3.00 3.00
3.00 3.00

matrix 1 - matrix 2 = :
-1.00 -1.00
-1.00 -1.00
请按任意键继续. . .

星羽 2008-02-17
  • 打赏
  • 举报
回复

胡乱写了一些,仅共参考

#include "stdio.h"

typedef struct {
float** datas;
int dim_x;
int dim_y;
} matrix;

int init_matrix(matrix* mat) {
int i;
int j;
if (!mat)
return 0;
printf("enter dimensions : ");
scanf("%d,%d", &mat->dim_x, &mat->dim_y);
if (mat->dim_x <= 0 || mat->dim_y <= 0)
return 0;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j) {
printf("enter %d%d : ", i, j);
scanf("%f", &mat->datas[i][j]);
}
return 1;
}

void release_matrix(matrix* mat){
int i;
if (!mat)
return;
for (i = 0; i < mat->dim_x; ++i)
free(mat->datas[i]);
free(mat->datas);
}

void print_matrix(matrix* mat) {
int i;
int j;
for (i = 0; i < mat->dim_x; ++i)
{
for (j = 0; j < mat->dim_y; ++j)
printf("%.2f ", mat->datas[i][j]);
printf("\n");
}
}

int add(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] + m2->datas[i][j];
return 1;
}

int sub(matrix* mat, const matrix* m1, const matrix* m2) {
int i;
int j;
if (!mat || !m1 || !m2)
return 0;
if (m1->dim_x != m2->dim_x || m1->dim_y != m2->dim_y)
return 0;
mat->dim_x = m1->dim_x;
mat->dim_y = m1->dim_y;
mat->datas = (float**)malloc(mat->dim_x * sizeof(float*));
for (i = 0; i < mat->dim_x; ++i)
mat->datas[i] = (float*)malloc(mat->dim_y * sizeof(float));
for (i = 0; i < mat->dim_x; ++i)
for (j = 0; j < mat->dim_y; ++j)
mat->datas[i][j] = m1->datas[i][j] - m2->datas[i][j];
return 1;
}

int main()
{
matrix m1;
matrix m2;
matrix m;
printf("init matrix 1\n");
init_matrix(&m1);
printf("\n");
printf("matrix 1 : \n");
print_matrix(&m1);
printf("init matrix 2\n");
printf("\n");
init_matrix(&m2);
printf("\n");
printf("matrix 2 : \n");
print_matrix(&m2);
printf("\n");
printf("matrix 1 + matrix 2 = : \n");
add(&m, &m1, &m2);
print_matrix(&m);
printf("\n");
printf("matrix 1 - matrix 2 = : \n");
sub(&m, &m1, &m2);
print_matrix(&m);
release_matrix(&m);
release_matrix(&m1);
release_matrix(&m2);
}


gccli 2008-02-17
  • 打赏
  • 举报
回复
LZ我曾经写过一个矩阵的类,写的不是很好,给你参考一下
#include <iostream>
#include <fstream>
using namespace std;

class CMatrix{
public:
CMatrix(int m,int n);
void initByDoc(const string& file = "");
size_t sizeL()const{
return row;
}
size_t sizeR()const{
return col;
}
double& at(const int& i,const int& j)const{
return mat[i][j];
}

friend ostream& operator<<(ostream&, const CMatrix&);
public:
virtual ~CMatrix(){delete [] mat;}

private:
size_t row,col;
double **mat;
};

CMatrix::CMatrix(int m, int n)
:row(m),col(n)
{
mat = (double**)new double*[row];
for(int i=0;i<row;++i)
{
mat[i] = (double*)new double[col];
}
for(int i=0;i<row;++i)
for(int j=0;j<col;++j)
mat[i][j] = 0.0;
}

/*
将矩阵的值写入文件中,通过文本文件初始化矩阵
*/
void CMatrix::initByDoc(const string& file){
if(file.empty())
throw "File Error!\n";
double reading;
ifstream fin(file.c_str());
for(int i=0;!fin.eof() && i<row;++i){
for(int j=0;!fin.eof() && j<col;++j){
fin>>reading;
mat[i][j] = (double)reading;
}
}
}

ostream& operator<<(ostream& os,const CMatrix& m){
for(int i=0;i<m.sizeL();++i){
for(int j=0;j<m.sizeR();++j){
os.width(10);
os<<left<<m.mat[i][j];
}
os<<'\n';
}
os<<'\n';
return os;
}

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧