随机数矩阵乘法
来源:互联网 发布:淘宝上的便宜被子 编辑:程序博客网 时间: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;
}
- 随机数矩阵乘法
- 【NOI2012】随机数生成器【矩阵乘法】
- BZOJ 2875 NOI2012 随机数生成器 矩阵乘法
- [BZOJ2875]NOI2012随机数生成器|矩阵乘法
- bzoj2875: [Noi2012]随机数生成器 裸矩阵乘法
- 【BZOJ 2875】[Noi2012]随机数生成器 矩阵乘法
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
- [BZOJ2875][NOI2012]随机数生成器(矩阵乘法)
- 2875: [Noi2012]随机数生成器 (矩阵乘法,快速幂,快速乘)
- [NOI2012]随机数生成器(矩阵乘法+快速乘)
- BZOJ_P2875&Codevs_P1281 [NOI2012]随机数生成器(数论+矩阵乘法)
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
- 2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- BZOJ 2875: [Noi2012]随机数生成器【矩阵乘法优化递推
- BZOJ2875: [Noi2012]随机数生成器 矩阵乘法+快速乘
- [BZOJ 2875][Noi2012]随机数生成器:矩阵乘法+快速乘
- [BZOJ 2875 & Vijos 1725] NOI 2012 随机数生成器 · 矩阵乘法+快速乘法
- 从Resource中获取到
- S3C2440A驱动RGB接口TFT LCD的研究
- android 删除桌面的快捷键shortcut
- in my life ,i love three thing
- 金钱、理想与人生(1)
- 随机数矩阵乘法
- 定义自己的xml
- christianlouboutin history
- 由人类对付老鼠看编程思想的发展
- 如何手动删除一个Windows服务
- launcher-->LauncherSetting数据库的研究
- christianlouboutin history(2)
- canvas -->bitmap
- TLD文件配置详解(自定义标签)