随机数矩阵乘法

来源:互联网 发布:淘宝上的便宜被子 编辑:程序博客网 时间:2024/06/06 15:46

最近有同事在讨论矩阵存储和乘法问题,一时兴起就写了算法.

要求: 矩阵A * 矩阵B ,要求A 和 B是由随机数组成,并且A是按行优先存储的,而B是按列优先存储的, 并输出A * B的结果,可重复计算.

考虑了一下, 矩阵存储可以用二维数组来存储, 但是根据要求矩阵需动态存储,所以采用指针的指针来存储和操作矩阵.

 

 

以下为实现代码:

//程序在vs.net2003 控制台下通过

 

#include "stdafx.h"

#include <time.h>

 

 

/********释放空间*********/

void freespace(int **p, int& num)

{

if(!p) return;

int i;

for (i=0; i<num; i++)   

free(p[i]);   

free(p); 

p = NULL;

}

/**********输出数组*******/ 

void prt(int** p, int& h, int& l) 

int i,j; 

for(i=0;i<h;i++) 

for(j=0;j<l;j++) 

printf(" %5d",p[i][j]); 

printf("/n"); 

 

/************输入数组*********/ 

int** inp(int ** p, int& h, int& l,bool column) 

int i,j;

if(p)

{

if(column)

freespace(p, l);

else

freespace(p, h);

}

srand(time(NULL));

if(column)

{

//随机按列优先存储数组

p = (int**)malloc(sizeof(int*)*l);   

for (i=0; i<l; i++)   

p[i] = (int*)malloc(sizeof(int)*h);

 

for(j=0;j<l;j++) 

for(i=0;i<h;i++) 

p[j][i]= rand()%100;

}else{

//随机按行优先存储数组

p = (int**)malloc(sizeof(int*)*h);   

for (i=0; i<h; i++)   

p[i] = (int*)malloc(sizeof(int)*l);

for(i=0;i<h;i++) 

for(j=0;j<l;j++) 

p[i][j]= rand()%100;

}

return p;

 

 

/*******矩阵乘,结果保存于m[][]******/ 

void mmul(int** a,int** b ,int &ah, int &al, int& bh, int& bl, int ** m) 

int i,j,k; 

if(m)

freespace(m, ah);

 

a = inp(a,ah, al, false); 

b = inp(b,bh, bl, true); 

 

m = (int**)malloc(sizeof(int*)*ah);   

for (i=0; i<ah; i++)   

m[i] = (int*)malloc(sizeof(int)*bl);

 

for(i=0;i<ah;i++) 

for(j=0;j<bl;j++) 

m[i][j]=0; 

 

for(i=0;i<ah;i++) 

for(j=0;j<bl;j++) 

for(k=0;k<bl;k++) 

m[i][j]+=a[i][k]*b[k][j];/***矩阵乘****/ 

 

prt(m, ah, bl); 

 

//程序入口

int main(int argc, char* argv[])

{

int agn=1,cpt=1; 

int ah, al, bh,bl;

int i;

int **a, **b, **m;

a = NULL;

b = NULL;

m = NULL;

while(agn==1) 

printf("请输入矩阵a的维数n1,n2!/n"); 

scanf("%d,%d", &ah, &al);

printf("请输入矩阵b的维数n1,n2!/n"); 

scanf("%d, %d", &bh, &bl);

//判断是否符合矩阵乘法的法则 A的列数是否等于B的行数

if(al != bh)

{

printf("不满足矩阵相乘的条件,请重新输入!/n");

continue;

}

 

while (cpt==1) 

mmul(a,b,ah,al, bh, bl,m);

printf("重新运算?[1]是 [0]否"); 

scanf("%d",&cpt); 

 

printf("是否重新输入矩阵?[1]是 [0]否"); 

scanf("%d",&agn); 

cpt = 1;

 

getchar();

 

//释放空间  

freespace(a, ah);

freespace(b, bl);

freespace(m, ah);

 

return 0;

}

 

原创粉丝点击