最近有同事在討論矩陣儲存和乘法問題,一時興起就寫了演算法.
要求: 矩陣a * 矩陣b ,要求a 和 b是由隨機數組成,並且a是按行優先儲存的,而b是按列優先儲存的, 並輸出a * b的結果,可重複計算.
考慮了一下, 矩陣儲存可以用二維陣列來儲存, 但是根據要求矩陣需動態儲存,所以採用指標的指標來儲存和操作矩陣.
以下為實現**:
//程式在vs.net2003 控制台下通過
#include "stdafx.h"
#include
/********釋放空間*********/
void freespace(int **p, int& num)
if(!p) return;
int i;
for (i=0; ifree(p[i]);
free(p);
p = null;
/**********輸出陣列*******/
void prt(int** p, int& h, int& l)
int i,j;
for(i=0;i
/************輸入陣列*********/
int** inp(int ** p, int& h, int& l,bool column)
int i,j;
if(p)
srand(time(null));
if(column)
else
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
m[i] = (int*)malloc(sizeof(int)*bl);
for(i=0;ifor(j=0;j
m[i][j]=0;
for(i=0;ifor(j=0;jfor(k=0;km[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)
while (cpt==1)
printf("是否重新輸入矩陣?[1]是 [0]否");
scanf("%d",&agn);
cpt = 1;
getchar();
//釋放空間
freespace(a, ah);
freespace(b, bl);
freespace(m, ah);
return 0;
NOI2012 隨機數生成器 矩陣乘法
棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法 linear congruential method 來生成乙個隨機數列,這種方法需要設定四個非負整數引數m,a,c,x 0 按照下面的公式生成出一系列隨機數 x n 1 ax n c mod m用這種方法生成的序列具...
matlab產生隨機數或隨機矩陣
matlab中隨機數生成器主要有 betarnd 貝塔分布的隨機數生成器 binornd 二項分布的隨機數生成器 chi2rnd 卡方分布的隨機數生成器 exprnd 指數分布的隨機數生成器 frnd f分布的隨機數生成器 gamrnd 伽瑪分布的隨機數生成器 geornd 幾何分布的隨機數生成器 ...
隨機數 偽隨機數
隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...