c语言 矩阵的乘法 动态二维数组形式

[复制链接]
查看11 | 回复0 | 2015-7-19 23:06:43 | 显示全部楼层 |阅读模式
http://hi.baidu.com/mayadong7349/blog/item/026cd3d12dae27d4a8ec9a21.html 幸得Draconious 大哥的帮助,改掉了原来代码中的错误!#include#include/*malloc函数的函数头,如果这个函数头不行,可以试试malloc.h*/int main(void){ int m,g,n; int i,j,k; printf("请输入第一个矩阵的行数和列数:\n"); scanf("%d%d",&m,&g);
printf("请输入第二个矩阵的列数(该矩阵行数等于第一个矩阵的列数):\n"); scanf("%d",&n); double **a=NULL;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为NULL;释放后再赋值为NULL在一些进行有效性判断的地方用a==NULL来判断指针是否为空指针*/ a=(double**)malloc(m*sizeof(double*));/*这句是动态定义二维数组的行数。新的标准ANSI C规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/ for(i=0;ip=(datatype*)malloc (sizeof(datatype)*m*n);
if(pmat->p){pmat->m=m;pmat->n=n;}}void init (mat *pmat,datatype *p,int m,int n){
init (pmat,m,n);
memcpy(pmat->p,p,m*n*sizeof(datatype));}void setdata(mat *pmat,datatype *p,int m,int n){
assert(pmat);
if(!pmat)return;
assert(p);
if(!p)return;
assert(m);
assert(n);
if(!m)return ;
if(!n)return;
if(p->m!=m || p->n!=n)
{
init (pmat,m,n);
}
memcpy(pmat->p,p,m*n*sizeof(datatype));}void destory (mat *pmat,int m,int n){
if(pmat->p)free(pmat->p);
pmat->m=pmat->n=0;}
/*********************************mat *clonemat (mat *a,mat *b);copy data from b to a;a->m=b->ma->n=a->n;**********************************/mat *clonemat (mat *a,mat *b){ assert(a); assert(b);
if(!a || !b)return NULL; assert(b->m); assert(b->n);
if(b->m=0 || b->n ==0 )return NULL;
if(a->m!=b->m || a->n!=b->n)
{
if(a->p)free(a->p);
init(a,b->p,b->m,b->n);
}
return a;}mat *matmul (mat *a,mat *b,mat *c){if(a.n!=b.m)return NULL; int cm,cn; cm=a->m; cm=b->n;
if(c==a){
mat ct;
ct.p=NULL;
ct.m=ct.n=0;
matmul (a,b,&ct)
clonemat(a,&ct);
free(ct.p);
}
else if(c==b){
mat ct;
ct.pmat=NULL;
ct.m=ct.n=0;
matmul (a,b,&ct)
clonemat(b,&ct);
free(ct.pmat);
}
else
{
if(c->m!=cm || c->n!=cn)
{
if(c->p) free(c->p);
init (c,cm,cn);
for(int i=0;in;k++)
{
c->p[i*n+j]+=a->p[i*a->n+k]*[k*c->n+j];
}
}
}
}
return c; }2)typedef int datatype; typedef struct {datatype **p;int m,n;}mat;void init (mat *pmat,int m,int n){
if(!pmat)return;
pmat->p=NULL;
pmat->p=(datatype**)malloc (sizeof(datatype)*m);
if(!pmat->p){printf("Error 1 Create mat Faliure,Cannot Alloc memory");}
pmat->p[0]=(datatype*)malloc (sizeof(datatype)*m*n);
if(!pmat->p[0])
{
printf("Error 2 Create mat Faliure,Cannot Alloc memory");
free(pmat->p);
return ;
}
for(i=1;ip=pmat->p[i-1]+n;
}
if(pmat->p && pmat->p[0] ){pmat->m=m;pmat->n=n;}
else {pmat->m=0;pmat->n=0;} }void init (mat *pmat,datatype *p,int m,int n){
assert(pmat);
assert(p);
assert(m);
assert(n);
if(!pmat || !p || !m || !n) return;
init (pmat,m,n);
assert(pmat->m);
assert(pmat->n);
if(pmat->m && pmat->n)
memcpy(pmat->p[0],p,m*n*sizeof(datatype));}void setdata(mat *pmat,datatype *p,int m,int n){
assert(pmat);
if(!pmat)return;
assert(p);
if(!p)return;
assert(m);
assert(n);
if(!m)return ;
if(!n)return;
if(p->m!=m || p->n!=n)
{
init (pmat,m,n);
}
memcpy(pmat->p[0],p,m*n*sizeof(datatype));}void destory (mat *pmat){ assert(pmat);
if(!pmat)return;assert(pmat->p);
if(pmat->p){
assert(pmat->p[0]);
if(pmat->p[0])free( pmat->p[0]);
free(pmat->p);
pmat->p=NULL; }
assert(pmat->m);
assert(pmat->n);
pmat->m=pmat->n=0;}
/*********************************mat *clonemat (mat *a,mat *b);copy data from b to a;a->m=b->ma->n=a->n;**********************************/mat *clonemat (mat *a,mat *b){ assert(a); assert(b);
if(!a || !b)return NULL; assert(b->m); assert(b->n);
if(b->m=0 || b->n ==0 )return NULL;
if(a->m!=b->m || a->n!=b->n)
{
if(a->p)free(a->p);
init(a,b->p,b->m,b->n);
}
return a;}mat *matmul (mat *a,mat *b,mat *c){if(a.n!=b.m)return NULL; int cm,cn; cm=a->m; cm=b->n;
if(c==a){
mat ct;
ct.p=NULL;
ct.m=ct.n=0;
matmul (a,b,&ct)
clonemat(a,&ct);
free(ct.p);
}
else if(c==b){
mat ct;
ct.pmat=NULL;
ct.m=ct.n=0;
matmul (a,b,&ct)
clonemat(b,&ct);
free(ct.pmat);
}
else
{
if(c->m!=cm || c->n!=cn)
{
if(c->p) free(c->p);
init (c,cm,cn);
}
for(int i=0;in;k++){
c->p[j]+=a->p[k] * b->p[k][j];
}
}
}
}
}
return c; }3)typedef int datatype; typedef struct {datatype **p;int m,n;}mat;void init (mat *pmat,int m,int n){
int i,j; if(!pmat)return;
pmat->p=NULL;
pmat->m=0;pmat->n=0;
pmat->p=(datatype**)malloc (sizeof(datatype)*m);
if(!pmat->p){printf("Error 1 Create mat Faliure,Cannot Alloc memory");return}
for( i=0;ip=NULL;
pmat->p=(datatype*)malloc (sizeof(datatype)*m*n);
if(!pmat->p)
{
printf("Error 1 ,alloc p[%d] failure, Cannot Alloc memory",i);
for(j=0;jp);
free(pmat->p);
return ;
}
}
pmat->m=m; pmat->n=n;}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行