当前位置:文档之家› 并行计算矩阵分块乘法

并行计算矩阵分块乘法

并行计算矩阵分块乘法
并行计算矩阵分块乘法

目录

一、题目及要求 (1)

1、题目 (1)

2、要求 (1)

二、设计算法、算法原理 (1)

三、算法描述、设计流程 (2)

3.1算法描述 (2)

3.2设计流程 (4)

四、源程序代码及运行结果 (6)

1、超立方 (6)

1.1超立方的源程序代码 (6)

1.2运行结果 (11)

2、网孔连接 (11)

2.1源程序代码 (11)

2.2运行结果 (18)

3、在数学软件中的计算结果 (19)

五、算法分析、优缺点 (19)

1、简单的并行分块乘法的过程为 (19)

2、使用Cannon算法时的算法分析 (20)

3、算法的优缺点 (21)

六、总结 (22)

参考文献 (23)

一、题目及要求

1、题目

简单并行分块乘法:(1)情形1: 超立方连接;(2)情形2:二维环绕网孔连接

已知,177511195310135411274329,7563895712314

2120143321

??????

? ??----=???????

?

?----=B A 求B A C ?=。 2、要求

(1)题目分析、查阅与题目相关的资料; (2)设计算法;

(3)算法实现、代码编写; (4)结果分析和性能分析与改进; (5)论文撰写、答辩;

二、设计算法、算法原理

要考虑的计算问题是C=AB,其中A 与B 分别是n n ?矩阵。 ①A 、B 和C 分成p p p ?=的方块阵ij A ,ij B 和ij C ,大小均为

p

n

p n ? ,p 个处理器编号为1

,1, (1)

0,....,0,0---p p p p

p p , ij P 存放ij A ,ij B 和ij C 。

②通讯:每行处理器进行A 矩阵块的多到多播送(得到ik A , k=0~1-p ) 每列处理器进行B 矩阵块的多到多播送(得到kj B , k=0~ 1-p )

③乘-加运算: ij P 做kj p k ik

ij B A

C ∑-==

1

三、算法描述、设计流程

3.1算法描述

超立方情形下矩阵的简单并行分块算法 输入:待选路的信包在源处理器中 输出:将原处理器中的信包送至其目的地 Begin

(1) for i=1 to n do

11--?=i i i d s r

endfor

(2) S V i ==,1 (3) while n i ≤do

(3.1)if 1=i r then 从当前节点V 选路到节点为V ?1 (3.2)1+=i i endwhile End

二维网孔情形下矩阵的简单并行分块算法 输入:待选路的信包处于源处理器中 输出:将各信包送至各自的目的地中 Begin

(1) 沿x 维将信包向左或向右选路至目的地的处理器所在的列 (2) 沿y 维将信包向上或向下选路至目的地的处理器所在的行 分块乘法算法

//输入: n n A ?,n n B ? ; 子快大小均为

p

n p

n ?

输出: n n C ?n

Begin

(1)for i=0 to 1-p do for all par-do ij p if i>k then ij A ←()m od ,1j i A +

endif

if j>k then

ij B ← B (i+1)mod , j endif endfor endfor

for i=0 to 1-p do for all ij p par-do ij C =ij A +ij B endfor Endfor End

3.2设计流程

以下是二维网孔与超立方连接设计流程。 如图3-1 二维网孔 步骤:

(1)先进行行播送; (2)再同时进行列播送;

图3-1 二维网孔示意图

4

4 3

超立方

步骤:依次从低维到高维播送, d-立方, d=0,1,2,3,4…; 算法流程如图所示:

图3-2 算法流程

四、源程序代码及运行结果

1、超立方

1.1超立方的源程序代码

#include "stdio.h"

#include "stdlib.h"

#include "mpi.h"

#define intsize sizeof(int)

#define floatsize sizeof(float)

#define charsize sizeof(char)

#define A(x,y) A[x*K+y]

#define B(x,y) B[x*N+y]

#define C(x,y) C[x*N+y]

#define a(x,y) a[x*K+y]

#define b(x,y) b[x*n+y]

#define buffer(x,y) buffer[x*n+y]

#define c(l,x,y) c[x*N+y+l*n]

float *a,*b,*c,*buffer;

int s;

float *A,*B,*C;

int M,N,K,P ;

int m,n;

int myid;

int p;

FILE *dataFile;

MPI_Status status;

double time1;

double starttime,endtime;

void readData()

{

int i,j;

starttime = MPI_Wtime();

dataFile=fopen("yin.txt","r");

fscanf(dataFile,"%d%d", &M, &K); A=(float *)malloc(floatsize*M*K); for(i = 0; i < M; i++) {

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

{

fscanf(dataFile,"%f", A+i*K+j);

}

}

fscanf(dataFile,"%d%d", &P, &N); if (K!=P) {

printf("the input is wrong\n");

exit(1);

}

B=(float *)malloc(floatsize*K*N); for(i = 0; i < K; i++) {

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

{

fscanf(dataFile,"%f", B+i*N+j);

}

}

fclose(dataFile);

printf("Input of file \"yin.txt\"\n");

printf("%d\t %d\n",M, K); for(i=0;i

for(j=0;j

printf("\n");

}

printf("%d\t %d\n",K, N); for(i=0;i

for(j=0;j

printf("\n");

}

C=(float *)malloc(floatsize*M*N); }

int gcd(int M,int N,int group_size)

{

int i;

for(i=M; i>0; i--)

{

if((M%i==0)&&(N%i==0)&&(i<=group_size))

return i;

}

return 1;

}

void printResult()

{

int i,j;

printf("\nOutput of Matrix C = AB\n");

for(i=0;i

{

for(j=0;j

printf("\n");

}

endtime=MPI_Wtime();

printf("\n");

printf("Whole running time = %f seconds\n",endtime-starttime); printf("Distribute data time = %f seconds\n",time1-starttime); printf("Parallel compute time = %f seconds\n",endtime-time1);

}

int main(int argc, char **argv)

{

int i,j,k,l,group_size,mp1,mm1;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&group_size);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

p=group_size;

if(myid==0)

{

readData();

}

if (myid==0)

for(i=1;i

{

MPI_Send(&M,1,MPI_INT,i,i,MPI_COMM_WORLD);

MPI_Send(&K,1,MPI_INT,i,i,MPI_COMM_WORLD);

MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD);

}

else

{

MPI_Recv(&M,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);

MPI_Recv(&K,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);

MPI_Recv(&N,1,MPI_INT,0,myid,MPI_COMM_WORLD,&status);

}

p=gcd(M,N,group_size);

m=M/p;

n=N/p;

if(myid

{

a=(float *)malloc(floatsize*m*K);

b=(float *)malloc(floatsize*K*n);

c=(float *)malloc(floatsize*m*N);

if (myid%2!=0)

buffer=(float *)malloc(K*n*floatsize);

if (a==NULL||b==NULL||c==NULL)

printf("Allocate space for a,b or c fail!");

if (myid==0)

{

for (i=0;i

for (j=0;j

a(i,j)=A(i,j);

for (i=0;i

for (j=0;j

b(i,j)=B(i,j);

}

if (myid==0)

{

for (i=1;i

{

MPI_Send(&A(m*i,0),K*m,MPI_FLOAT,i,i,MPI_COMM_WORLD); for (j=0;j

MPI_Send(&B(j,n*i),n,MPI_FLOAT,i,i,MPI_COMM_WORLD);

}

free(A);

free(B);

}

else

{

MPI_Recv(a,K*m,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status); for (j=0;j

MPI_Recv(&b(j,0),n,MPI_FLOAT,0,myid,MPI_COMM_WORLD,&status);

}

if (myid==0)

time1=MPI_Wtime();

for (i=0;i

{

l=(i+myid)%p;

for (k=0;k

for (j=0;j

for (c(l,k,j)=0,s=0;s

c(l,k,j)+=a(k,s)*b(s,j);

mm1=(p+myid-1)%p;

mp1=(myid+1)%p;

if (i!=p-1)

{

if(myid%2==0)

{

MPI_Send(b,K*n,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);

MPI_Recv(b,K*n,MPI_FLOAT,mp1,myid,MPI_COMM_WORLD,&status);

}

else

{

for(k=0;k

for(j=0;j

buffer(k,j)=b(k,j);

MPI_Recv(b,K*n,MPI_FLOAT,mp1,myid,MPI_COMM_WORLD,&status);

MPI_Send(buffer,K*n,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);

}

}

}

if (myid==0)

for(i=0;i

for(j=0;j

C(i,j)=*(c+i*N+j);

if (myid!=0)

MPI_Send(c,m*N,MPI_FLOAT,0,myid,MPI_COMM_WORLD);

else

{

for(k=1;k

{

MPI_Recv(c,m*N,MPI_FLOAT,k,k,MPI_COMM_WORLD,&status); for(i=0;i

for(j=0;j

C((k*m+i),j)=*(c+i*N+j);

}

}

if(myid==0)

printResult();

}

MPI_Finalize();

if(myid

{

free(a);

free(b);

free(c);

if(myid==0)

free(C);

if(myid%2!=0)

free(buffer);

}

return (0);

}

1.2运行结果

图4.1 4个处理器的运行结果

2、网孔连接

2.1源程序代码

#include

#include

#include

#include

#include

#include

/* 全局变量声明 */

float **A, **B, **C; /* 总矩阵,C = A * B */

float *a, *b, *c, *tmp_a, *tmp_b; /* a、b、c表分块,tmp_a、tmp_b表缓冲区 */

int dg, dl, dl2,p, sp; /* dg:总矩阵维数;dl:矩阵块维数;dl2=dl*dl;p:处理器个数;sp=sqrt(p) */

int my_rank, my_row, my_col; /* my_rank:处理器ID;(my_row,my_col):处理器逻辑阵列坐标 */

MPI_Status status;

/*

*函数名: get_index

*功能:处理器逻辑阵列坐标至rank号的转换

*输入:坐标、逻辑阵列维数

*输出:rank号

*/

int get_index(int row, int col, int sp)

{

return ((row+sp)%sp)*sp + (col+sp)%sp;

}

/*

*函数名:random_A_B

*功能:随机生成矩阵A和B

*/

void random_A_B()

{

int i,j;

float m;

//srand((unsigned int)time(NULL)); /*设随机数种子*

/*随机生成A,B,并初始化C*/

for(i=0; i

for(j=0; j

{

scanf("%f",&m);

A[i][j] = m;

C[i][j] = 0.0;

m=0;

}

for(i=0; i

for(j=0; j

{

scanf("%f",&m);

B[i][j] = m;

m=0;

}

}

/* 函数名:scatter_A_B

* 功能:rank为0的处理器向其他处理器发送A、B矩阵的相关块

*/

void scatter_A_B()

{

int i,j,k,l;

int p_imin,p_imax,p_jmin,p_jmax;

for(k=0; k

{

/*计算相应处理器所分得的矩阵块在总矩阵中的坐标范围*/

p_jmin = (k % sp ) * dl;

p_jmax = (k % sp + 1) * dl-1;

p_imin = (k - (k % sp))/sp * dl;

p_imax = ((k - (k % sp))/sp +1) *dl -1;

l = 0;

/*rank=0的处理器将A,B中的相应块拷至tmp_a,tmp_b,准备向其他处理器发送*/

for(i=p_imin; i<=p_imax; i++)

{

for(j=p_jmin; j<=p_jmax; j++)

{

tmp_a[l] = A[i][j];

tmp_b[l] = B[i][j];

l++;

}

}

/*rank=0的处理器直接将自己对应的矩阵块从tmp_a,tmp_b拷至a,b*/ if(k==0)

{

memcpy(a, tmp_a, dl2 * sizeof(float));

memcpy(b, tmp_b, dl2 * sizeof(float));

} else /*rank=0的处理器向其他处理器发送tmp_a,tmp_b中相关的矩阵块*/

{

MPI_Send(tmp_a, dl2, MPI_FLOAT, k, 1, MPI_COMM_WORLD);

MPI_Send(tmp_b, dl2, MPI_FLOAT, k, 2, MPI_COMM_WORLD);

}

}

}

/*

*函数名:init_alignment

*功能:矩阵A和B初始对准

*/

void init_alignment()

{

MPI_Sendrecv(a, dl2, MPI_FLOAT, get_index(my_row,my_col-my_row,sp), 1,

tmp_a, dl2, MPI_FLOAT, get_index(my_row,my_col+my_row,sp), 1, MPI_COMM_WORLD, &status);

memcpy(a, tmp_a, dl2 * sizeof(float) );

/*将B中坐标为(i,j)的分块B(i,j)向上循环移动j步*/

MPI_Sendrecv(b, dl2, MPI_FLOAT, get_index(my_row-my_col,my_col,sp), 1,

tmp_b, dl2, MPI_FLOAT, get_index(my_row+my_col,my_col,sp), 1, MPI_COMM_WORLD, &status);

memcpy(b, tmp_b, dl2 * sizeof(float) );

}

/*

*函数名:main_shift

*功能:分块矩阵左移和上移,并计算分块c

*/

void main_shift()

{

int i,j,k,l;

for(l=0; l

{

/*矩阵块相乘,c+=a*b */

for(i=0; i

for(j=0; j

for(k=0; k

c[i*dl+j] += a[i*dl+k]*b[k*dl+j];

/* 将分块a左移1位 */

MPI_Send(a , dl2, MPI_FLOAT, get_index(my_row, my_col-1, sp), 1, MPI_COMM_WORLD);

MPI_Recv(a , dl2, MPI_FLOAT, get_index(my_row, my_col+1, sp), 1, MPI_COMM_WORLD, &status);

/* 将分块b上移1位 */

MPI_Send(b , dl2, MPI_FLOAT, get_index(my_row-1, my_col, sp), 1, MPI_COMM_WORLD);

MPI_Recv(b , dl2, MPI_FLOAT, get_index(my_row+1, my_col, sp), 1, MPI_COMM_WORLD, &status);

}

}

/*

*函数名:collect_c

*功能:rank为0的处理器从其余处理器收集分块矩阵c

*/

void collect_C()

{

int i,j,i2,j2,k;

int p_imin,p_imax,p_jmin,p_jmax; /* 分块矩阵在总矩阵中顶点边界值 */

/* 将rank为0的处理器中分块矩阵c结果赋给总矩阵C对应位置 */

for (i=0;i

for(j=0;j

C[i][j]=c[i*dl+j];

for (k=1;k

{

/*将rank为0的处理器从其他处理器接收相应的分块c*/

MPI_Recv(c, dl2, MPI_FLOAT, k, 1, MPI_COMM_WORLD, &status);

p_jmin = (k % sp ) *dl;

p_jmax = (k % sp + 1) *dl-1;

p_imin = (k - (k % sp))/sp *dl;

p_imax = ((k - (k % sp))/sp +1) *dl -1;

i2=0;

/*将接收到的c拷至C中的相应位置,从而构造出C*/

for(i=p_imin; i<=p_imax; i++)

{

j2=0;

for(j=p_jmin; j<=p_jmax; j++)

{

C[i][j]=c[i2*dl+j2];

j2++;

}

i2++;

}

}

}

/*函数名:print

*功能:打印矩阵

*输入:指向矩阵指针的指针,字符串

*/

void print(float **m,char *str)

{

int i,j;

printf("%s",str);

/*打印矩阵m*/

for(i=0;i

{

for(j=0;j

printf("%15.0f ",m[i][j]);

printf("\n");

}

printf("\n");

}

/*

*函数名:main

*功能:主过程,Cannon算法,矩阵相乘

*输入:argc为命令行参数个数,argv为每个命令行参数组成的字符串数组 */

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

{

int i;

MPI_Init(&argc, &argv); /* 启动MPI计算 */

MPI_Comm_size(MPI_COMM_WORLD, &p); /* 确定处理器个数 */

MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* 确定各自的处理器标识符*/

sp = sqrt(p);

/* 确保处理器个数是完全平方数,否则打印错误信息,程序退出 */

if (sp*sp != p)

{

if (my_rank == 0)

printf("Number of processors is not a quadratic number!\n");

MPI_Finalize();

exit(1);

}

if (argc != 2)

{

if (my_rank == 0)

printf("usage: mpirun -np ProcNum cannon MatrixDimension\n"); MPI_Finalize();

exit(1);

}

dg = atoi(argv[1]); /* 总矩阵维数 */

dl = dg / sp; /* 计算分块矩阵维数 */

dl2 = dl * dl;

/* 计算处理器在逻辑阵列中的坐标 */

my_col = my_rank % sp ;

my_row = (my_rank-my_col) / sp ;

/* 为a、b、c分配空间 */

a = (float *)malloc( dl2 * sizeof(float) );

b = (float *)malloc( dl2 * sizeof(float) );

c = (float *)malloc( dl2 * sizeof(float) );

/* 初始化c */

for(i=0; i

c[i] = 0.0;

/* 为tmp_a、tmp_b分配空间 */

tmp_a = (float *)malloc( dl2 * sizeof(float) );

tmp_b = (float *)malloc( dl2 * sizeof(float) );

if (my_rank == 0)

{

/* rank为0的处理器为A、B、C分配空间 */

A = (float **)malloc( dg * sizeof(float*) );

B = (float **)malloc( dg * sizeof(float*) );

C = (float **)malloc( dg * sizeof(float*) );

for(i=0; i

{

A[i] = (float *)malloc( dg * sizeof(float) );

B[i] = (float *)malloc( dg * sizeof(float) );

C[i] = (float *)malloc( dg * sizeof(float) );

}

random_A_B(); /* rank为0的处理器随机化生成A、B矩阵 */

scatter_A_B(); /* rank为0的处理器向其他处理器发送A、B矩阵的相关块 */

}

else /* rank不为0的处理器接收来自rank为0的处理器的相应矩阵分块 */

{

MPI_Recv(a, dl2, MPI_FLOAT, 0 , 1, MPI_COMM_WORLD, &status); MPI_Recv(b, dl2, MPI_FLOAT, 0 , 2, MPI_COMM_WORLD, &status);

}

init_alignment(); /* A、B矩阵的初始对准 */

main_shift(); /* 分块矩阵左移、上移, cannon算法的主过程 */

if(my_rank == 0)

{

collect_C(); /* rank为0的处理器从其余处理器收集分块矩阵c */

print(A,"random matrix A : \n"); /* 打印矩阵A */

print(B,"random matrix B : \n"); /* 打印矩阵B */

print(C,"Matrix C = A * B : \n"); /* 打印矩阵C */

} else

{

MPI_Send(c,dl2,MPI_FLOAT,0,1,MPI_COMM_WORLD); }

MPI_Barrier(MPI_COMM_WORLD); /* 同步所有处理器 */

MPI_Finalize(); /* 结束MPI计算 */

return 0;

}

2.2运行结果

图4.2 4个处理器的运行结果

3、在数学软件中的计算结果

图4.3 在MATLAB 中的运行结果

五、算法分析、优缺点

1、简单的并行分块乘法的过程为

(1)分块:将: A n ×n 与 B n ×n 分成p 块A i,j 和B i,j (0≤i,j ≤1-p ),每块大小为)/()/(p n p n ?,并将它们分配给

p p ?个处理器

(1

,11

,

00,0,...,,...,---p p p P

P P )。开始时P i,j 存放在块A i,j 与块B i,j ,然后计算块C i,j 。

(2)通信:为了计算块C i,j ,总结需要所有块A i,j 与块B i,j (0≤k ≤1-p ),为

_矩阵的Kronecker乘积的性质与应用

矩阵Kronecker乘积的性质与应用 摘要 按照矩阵乘法的定义,我们知道要计算矩阵的乘积AB,就要求矩阵A的列数和矩阵B的行数相等,否则乘积AB是没有意义的。那是不是两个矩阵不满足这个条件就不能计算它们的乘积呢?本文将介绍矩阵的一种特殊乘积B A ,它对矩阵的行数和列数的并没有具体的要求,它叫做矩阵的Kronecker积(也叫直积或张量积)。 本文将从矩阵的Kronecker积的定义出发,对矩阵的Kronecker 积进行介绍和必要的说明。之后,对Kronecker积的运算规律,可逆性,秩,特征值,特征向量等性质进行了具体的探究,得出结论并加以证明。此外,还对矩阵的拉直以及矩阵的拉直的性质进行了说明和必要的证明。 矩阵的Kronecker积是一种非常重要的矩阵乘积,它应用很广,理论方面在诸如矩阵方程的求解,矩阵微分方程的求解等矩阵理论的研究中有着广泛的应用,实际应用方面在诸如图像处理,信息处理等方面也起到重要的作用。本文讨论矩阵的Kronecker积的性质之后还会具体介绍它在矩阵方程中的一些应用。 关键词: 矩阵;Kronecker积;矩阵的拉直;矩阵方程;矩阵微分方程Properties and Applications of matrix Kronecker

product Abstract According to the definition of matrix multiplication, we know that to calculate the matrix product AB, requires the number of columns of the matrix A and matrix B is equal to the number of rows, otherwise the product AB makes no sense.That is not two matrices not satisfy this condition will not be able to calculate their product do?This article will describe a special matrix product B A , the number of rows and columns of a matrix and its no specific requirements, it is called the matrix Kronecker product (also called direct product or tensor product). This paper will define the matrix Kronecker product of view, the Kronecker product matrix are introduced and the necessary instructions. Thereafter, the operation rules Kronecker product, the nature of reversibility, rank, eigenvalues, eigenvectors, etc. specific inquiry, draw conclusions and to prove it. In addition, the properties of the stretch of matrix and its nature have been described and the necessary proof. Kronecker product matrix is a very important matrix product, its use is very broad, theoretical research, and other matrix solving differential equations, such as solving the matrix equation matrix theory has been widely applied in practical applications such as image processing aspects of information processing, also play an important role. After the article discusses the nature of the matrix Kronecker product it will introduce a number of specific applications in the matrix equation. Keywords: Matrix; Kronecker product; Stretch of matrix; Matrix equation; Matrix Differential Equations 目录

矩阵的运算及其运算规则

矩阵基本运算及应用 牛晨晖 在数学中,矩阵是一个按照长方阵列排列的或集合。矩阵是高等代中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、、光学和中都有应用;中,制作也需要用到矩阵。矩阵的运算是领域的重要问题。将为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。在电力系统方面,矩阵知识已有广泛深入的应用,本文将在介绍矩阵基本运算和运算规则的基础上,简要介绍其在电力系统新能源领域建模方面的应用情况,并展望随机矩阵理论等相关知识与人工智能电力系统的紧密结合。 1矩阵的运算及其运算规则 1.1矩阵的加法与减法 1.1.1运算规则 设矩阵,, 则 简言之,两个矩阵相加减,即它们相同位置的元素相加减! 注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.

1.1.2运算性质 满足交换律和结合律 交换律; 结合律. 1.2矩阵与数的乘法 1.2.1运算规则 数乘矩阵A,就是将数乘矩阵A中的每一个元素,记为或.特别地,称称为的负矩阵. 1.2.2运算性质 满足结合律和分配律 结合律:(λμ)A=λ(μA);(λ+μ)A =λA+μA. 分配律:λ(A+B)=λA+λB. 1.2.3典型举例 已知两个矩阵 满足矩阵方程,求未知矩阵. 解由已知条件知

? 1.3矩阵与矩阵的乘法 1.3.1运算规则 设,,则A与B的乘积是这样一个矩阵: (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即. (2) C的第行第列的元素由A的第行元素与B的第列元素对应相乘,再取乘积之和. 1.3.2典型例题 设矩阵 计算 解是的矩阵.设它为

矩阵的运算及其运算规则

矩阵基本运算及应用 201700060牛晨晖 在数学中,矩阵是一个按照长方阵列排列的复数或实数集合。矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。在电力系统方面,矩阵知识已有广泛深入的应用,本文将在介绍矩阵基本运算和运算规则的基础上,简要介绍其在电力系统新能源领域建模方面的应用情况,并展望随机矩阵理论等相关知识与人工智能电力系统的紧密结合。 1矩阵的运算及其运算规则 1.1矩阵的加法与减法 1.1.1运算规则 设矩阵,, 则

简言之,两个矩阵相加减,即它们相同位置的元素相加减! 注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的. 1.1.2运算性质 满足交换律和结合律 交换律; 结合律. 1.2矩阵与数的乘法 1.2.1运算规则 数乘矩阵A,就是将数乘矩阵A中的每一个元素,记为或. 特别地,称称为的负矩阵. 1.2.2运算性质 满足结合律和分配律 结合律:(λμ)A=λ(μA);(λ+μ)A =λA+μA. 分配律:λ(A+B)=λA+λB.

已知两个矩阵 满足矩阵方程,求未知矩阵. 解由已知条件知 1.3矩阵与矩阵的乘法 1.3.1运算规则 设,,则A与B的乘积是这样一个矩阵: (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即 . (2) C的第行第列的元素由A的第行元素与B的第列元素对应相乘,再取乘积之和.

并行计算-实验二-矩阵乘法的OpenMP实现及性能分析

深圳大学 实验报告 课程名称:并行计算 实验名称:矩阵乘法的OpenMP实现及性能分析姓名: 学号: 班级: 实验日期:2011年10月21日、11月4日

一. 实验目的 1) 用OpenMP 实现最基本的数值算法“矩阵乘法” 2) 掌握for 编译制导语句 3) 对并行程序进行简单的性能 二. 实验环境 1) 硬件环境:32核CPU 、32G 存计算机; 2) 软件环境:Linux 、Win2003、GCC 、MPICH 、VS2008; 4) Windows 登录方式:通过远程桌面连接192.168.150.197,用户名和初始密码都是自己的学号。 三. 实验容 1. 用OpenMP 编写两个n 阶的方阵a 和b 的相乘程序,结果存放在方阵c 中,其中乘法用for 编译制导语句实现并行化操作,并调节for 编译制导中schedule 的参数,使得执行时间最短,写出代码。 方阵a 和b 的初始值如下: ????????? ? ??????????-++++=12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1n n n n n n n a ???????? ? ???????????= 1,...,1,1,1..1,...,1,1,11,...,1,1,11,..., 1,1,1b 输入: 方阵的阶n 、并行域的线程数 输出: c 中所有元素之和、程序的执行时间 提示: a,b,c 的元素定义为int 型,c 中所有元素之各定义为long long 型。 Windows 计时: 用中的clock_t clock( void )函数得到当前程序执行的时间 Linux 计时: #include

分块矩阵在行列式计算中的应用(1)

矩阵与行列式的关系 矩阵是一个有力的数学工具,有着广泛的应用,同时矩阵也是代数特别是线性代数的一个主要研究对象.矩阵的概念和性质都较易掌握,但是对于阶数较大的矩阵的运算则会是一个很繁琐的过程,甚至仅仅依靠矩阵的基本性质很难计算,为了更好的处理这个问题矩阵分块的思想应运而生[]1. 行列式在代数学中是一个非常重要、又应用广泛的概念.对行列式的研究重在计算,但由于行列式的计算灵活、技巧性强,尤其是计算高阶行列式往往较为困难.行列式的计算通常要根据行列式的具体特点采用相应的计算方法,有时甚至需要将几种方法交叉运用,而且一题多种解法的情况很多,好的方法能极大降低计算量,因此行列式计算方法往往灵活多变.在解决行列式的某些问题时,对于级数较高的行列式,常采用分块的方法,将行列式分成若干子块,往往可以使行列式的结构清晰,计算简化.本文在广泛阅读文献的基础上,从温习分块矩阵的定义和性质出发,给出了分块矩阵的一些重要结论并予以证明,在此基础上讨论利用分块矩阵计算行列式的方法,并与其他方法相互比较,以此说明分块矩阵在行列式计算中的优势. 1.1 矩阵的定义 有时候,我们将一个大矩阵看成是由一些小矩阵组成的,就如矩阵是由数组成的一样[]1.特别在运算中,把这些小矩阵当做数一样来处理.这就是所谓的矩阵的分块.把原矩阵分别按照横竖需要分割成若干小块,每一小块称为矩阵的一个子块或子矩阵,则原矩阵是以这些子块为元素的分块矩阵.这是处理级数较高的矩阵时常用的方法. 定义1[]2 设A 是n m ?矩阵,将A 的行分割为r 段,每段分别包含r m m m 21行,将 A 的列分割为s 段,每段包含s m m m 21列,则 ?? ? ? ? ? ? ??=rs r r s s A A A A A A A A A A 21 2222111211 , 就称为分块矩阵,其中ij A 是j i m m ?矩阵(,,,2,1r i =s j ,,2,1 =). 注:分块矩阵的每一行(列)的小矩阵有相同的行(列)数. 例如,对矩阵A 分块, = ?? ? ? ? ? ? ? ?-=21010301012102102301A ??? ? ??22211211 A A A A , 其中

矩阵乘法题目

十个利用矩阵乘法解决的经典题目 By Matrix67 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中,一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。为什么它又满足结合律呢?仔细想想你会发现这也是废话。假设你有三个矩阵A、B、C,那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。 经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。操作有平移、缩放、翻转和旋转 这里的操作是对所有点同时进行的。其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时 O(m+n)。假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。 经典题目2 给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。 由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。这就告诉我们,计算A^n也可以使用二分快速求幂的方法。例如,为了算出A^25的值,我们只需要递归地计算出A^12、A^6、A^3的值即可。根据这里的一些结果,我们可以在计算过程中不断取模,避免高精度运算。 经典题目3 POJ3233 (感谢rmq) 题目大意:给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加就是对应位置分别相加)。输出的数据mod m。k<=10^9。 这道题两次二分,相当经典。首先我们知道,A^i可以二分求出。然后我们需要对整个题目的数据规模k进行二分。比如,当k=6时,有: A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3) 应用这个式子后,规模k减小了一半。我们二分求出A^3后再递归地计算A + A^2 + A^3,即可得到原问题的答案。

矩阵乘法的性质优秀教学设计

矩阵乘法的性质 【教学目标】 一、知识与技能:理解矩阵乘法不满足交换吕和消去律,会验证矩阵乘法满足结合律 二、过程与方法:比较演算法 三、情感态度和价值观:体会类比推理中结论全真的含义 【教学重难点】 结合律验证 【教学过程】 一、复习二阶矩阵的乘法运算规律与实数乘法性质 实数乘法运算性质:交换律ab=ba 结合律 (ab)c=a(bc) 消去律:ab=ac ,a ≠0则b=c 零律:0a=a0=0 1律:1a=a1=a 分配律 a(b+c)=ab+ac 问题:对于矩阵乘法,这些结论是否还成立? 二、矩阵的简单性质 1.由上节知识知:消去律未必成立,即AB=AC ,A ≠0,则未必有B=C 2.交换律呢? 例1.(1)已知P=??????1001k ,Q=?? ????1002k ,求PQ 及QP ,说明二者的几何意义及是否相等 (2)A=??????2001,B=?? ????-3241,求AB .BA ,说明二者是否相等 解:(1)PQ=??????120 0k k ,QP=??????1200k k ,二者相等, PQ :(x ,y)倍横坐标变为原来的2:k T Q (k 2x 2,y)倍纵坐标变为原来的1k (k 2x ,k 1y) QP : ??????????????????y k x k k T y k x k T y x Q P 12211::倍横坐标变为原来的倍纵坐标变为原来的 (2)AB=??????-6441,BA=?? ????-6281,AB ≠BA

说明:对于矩阵乘法,交换律未必成立 3.结合律是否成立? A=??????1111d c b a ,B=??????2222d c b a ,C=??????3333d c b a , 则AB=?? ????++++2121212121212121d d b c c d a c d b b a c b a a , BC=??????++++32323 23232323232d d b c c d a c d b b a c b a a (AB)C=??????++++2121212121212 121d d b c c d a c d b b a c b a a ?? ????3333d c b a =??????++++++++++++3213213213213 21321321321321321321321321321321321d d d d b c b c d b a c c d d c b c a c d a a c d d b d b a b c b b a a c d b c b a a c b a a a A(BC)=??????1111d c b a ?? ????++++3232323232323232d d b c c d a c d b b a c b a a =??????++++++++++++3213213213213 21321321321321321321321321321321321d d d d b c b c d b a c c d d c b c a c d a a c d d b d b a b c b b a a c d b c b a a c b a a a 说明:矩阵乘法满足结合律 4.自己验证:矩阵乘法满足结合律,即:A(B+C)=AB+AC 5.零律是否满足,证明你的结论,即AO=OA=O 是否成立?(成立) 6.一律是否满足?证明你的结论,即EA=AE=A 是否成立?(成立) 三、备用练习与例题 1.计算(1)????????????-??????011010210110 (2)32301?? ????- (解答(1)??????-1101 (2)?? ????-8901) 2.求使式子成立的a .b .c .d ,?? ????=????????????34120032d c b a (解答:a=1,b=4,c=1,d=1) 3.a .b 为实数,矩阵A=?? ????b a 10将直线L :2x+y-7=0变为自身,求a ,b (解答a=1/2,b=1) 四、习题: [补充习题] 1.对于三个非零二阶矩阵。下列式子中正确的序号是____________

并行计算矩阵分块乘法

目录 一、题目及要求 (1) 1、题目 (1) 2、要求 (1) 二、设计算法、算法原理 (1) 三、算法描述、设计流程 (2) 3.1算法描述 (2) 3.2设计流程 (4) 四、源程序代码及运行结果 (6) 1、超立方 (6) 1.1超立方的源程序代码 (6) 1.2运行结果 (11) 2、网孔连接 (11) 2.1源程序代码 (11) 2.2运行结果 (18) 3、在数学软件中的计算结果 (19) 五、算法分析、优缺点 (19) 1、简单的并行分块乘法的过程为 (19) 2、使用Cannon算法时的算法分析 (20) 3、算法的优缺点 (21) 六、总结 (22) 参考文献 (23)

一、题目及要求 1、题目 简单并行分块乘法:(1)情形1: 超立方连接;(2)情形2:二维环绕网孔连接 已知,177511195310135411274329,7563895712314 2120143321 ?????? ? ??----=??????? ??----=B A 求B A C ?=。 2、要求 (1)题目分析、查阅与题目相关的资料; (2)设计算法; (3)算法实现、代码编写; (4)结果分析和性能分析与改进; (5)论文撰写、答辩; 二、设计算法、算法原理 要考虑的计算问题是C=AB,其中A 与B 分别是n n ?矩阵。 ①A 、B 和C 分成p p p ?=的方块阵ij A ,ij B 和ij C ,大小均为p n p n ? ,p 个处理器编号为1 ,1, (1) 0,....,0,0---p p p p p p , ij P 存放ij A ,ij B 和ij C 。 ②通讯:每行处理器进行A 矩阵块的多到多播送(得到ik A , k=0~1-p ) 每列处理器进行B 矩阵块的多到多播送(得到kj B , k=0~ 1-p ) ③乘-加运算: ij P 做kj p k ik ij B A C ∑-== 1

分块矩阵乘法的例子

分块矩阵乘法的例子 例 1 用分块法计算,AB 其中 00 51 2414 21,5 31001200 2 0-???? ? ?== ? ? ? ?-? ?? ? A B . 解 B A,如上分块, ???? ??=2221 1211 A A A A A , ??? ? ??=2322 21 131211 B B B B B B B , 其中 111221224 21(0,0),(5), ,,0 12????==== ? ?-?? ?? A A A A ()()()0,20,0,01,1342,51232221131211===??? ? ??-=???? ??=???? ??=B B B B B B ; 令==C AB ??? ? ??232221 131211 C C C C C C ,其中 =+=2112111111B A B A C )0()0)(5(51)00(=+??? ? ??, =+=2212121112B A B A C )00(()()()1002051342=+???? ??, =+=2312131113B A B A C )0()0)(5(01)00(=+???? ??-, =+=2122112121B A B A C ??? ? ??-=???? ??+???? ?????? ??-514)0(21511024, =+=2222122122B A B A C ???? ??-=???? ??+???? ?????? ??-332014)20(2113421024, =+=2322132123B A B A C ??? ? ??-=???? ??+???? ??-???? ??-04)0(21011024.

矩阵基本性质

矩阵的基本性质 矩阵的第?第列的元素为。我们?或()表?的单位矩阵。 1.矩阵的加减法 (1),对应元素相加减 (2)矩阵加减法满足的运算法则 a.交换律: b.结合律: c. d. 2.矩阵的数乘 (1),各元素均乘以常数 (2)矩阵数乘满足的运算法则 a.数对矩阵的分配律: b.矩阵对数的分配律: c.结合律: d. 3.矩阵的乘法 (1),左行右列对应元素相乘后求和为C的第行第列的元素(2)矩阵乘法满足的运算法则 a.对于一般矩阵不满足交换律,只有两个方正满足且有 b.分配律: c.结合律: d.数乘结合律: 4.矩阵的转置, (1)矩阵的幂:,,…,

(2)矩阵乘法满足的运算法则 a. b. c. d. 5.对称矩阵:即;反对称矩阵:即 (1)设为(反)对称矩阵,则仍是(反)对称矩阵。 (2)设为对称矩阵,则或仍是对称矩阵的充要条件=。 (3)设为(反)对称矩阵,则,也是(反)对称矩阵。 (4)对任意矩阵,则分别是对称矩阵和反对称矩阵且. (5) 6. Hermite矩阵:即;反Hermite矩阵,即 a. b. c. d. e. f.(当矩阵可逆时) 7.正交矩阵:若,则是正交矩阵 (1) (2)

8.酉矩阵:若,则是酉矩阵 (1) (2) (3), (4) 9.正规矩阵:若,则是正规矩阵;若,则是实正规矩阵 10.矩阵的迹和行列式 (1)为矩阵的迹;或为行列式 (2);注:矩阵乘法不满足交换律 (3) (4),为酉矩阵,则 (5) (6) (7) (8) (9) (10) (11) (12),,则其中为奇异分解值的特征值 11.矩阵的伴随矩阵 (1)设由行列式的代数余子式所构成的矩阵

分块矩阵的应用论文

分块矩阵的应用 引言 矩阵作为数学工具之一有其重要的实用价值,它常见于很多学科中,如:线性代数、线性规划、统计分析,以及组合数学等,在实际生活中,很多问题都可以借用矩阵抽象出来进行表述并进行运算,如在各循环赛中常用的赛格表格等,矩阵的概念和性质相对矩阵的运算较容易理解和掌握,对于矩阵的运算和应用,则有很多的问题值得我们去研究,其中当矩阵的行数和列数都相当大时,矩阵的计算和证明中会是很烦琐的过程,因此这时我们得有一个新的矩阵处理工具,来使这些问题得到更好的解释,矩阵分块的思想由此产生. 矩阵分块,就是把一个大矩阵看成是由一些小矩阵组成的.就如矩阵的元素(数) 一样,特别是在运算中,把这些小矩阵当作数一样来处理.把矩阵分块运算有许多方便之处.因为在分块之后,矩阵间的相互关系可以看得更清楚,在实际操作中与其他方法相比,一般来说,不仅非常简洁,而且方法也很统一,具有较大的优越性,是在处理级数较高的矩阵时常用的方法.比如,从行列式的性质出发,可以推导出分块矩阵的若干性质,并可以利用这些性质在行列式计算和证明中的应用分块矩阵;也可以借助分块矩阵的初等变换求逆矩阵及矩阵的秩等;再如利用分块矩阵求高阶行列式,如设A 、C 都是n 阶矩阵,其中0A ≠,并且AC CA =,则可求得A B AD BC C D =-;分块矩阵也可以在求解线性 方程组应用. 本文将通过对分块矩阵性质的研究,比较系统的总结讨论分块矩阵在计算和证明方面的应用,从而确认分块矩阵为处理很多代数问题带来很大的便利.

1 分块矩阵的定义及相关运算性质 1.1分块矩阵的定义 矩阵分块,就是把一个大矩阵看成是由一些小矩阵组成的.就如矩阵的元素(数) 一样,特别是在运算中,把这些小矩阵当作数一样来处理. 定义1设A 是一个m n ?矩阵,若用若干横线条将它分成r 块,再用若干纵线条将它 分成s 块,于是有rs 块的分块矩阵,即1111...............s r rs A A A A A ???? =?????? ,其中ij A 表示的是一个矩阵. 1.2分块矩阵的相关运算性质 1. 2.1加法 设() ij m n A a ?=() ij m n B b ?=,用同样的方法对,A B 进行分块 () ij r s A A ?=,() ij r s B B ?=, 其中ij A ,ij B 的级数相同, 则 ()ij ij r s A B A B ?+=+. 1.2.2数乘 设是任() () ,ij ij m n r s A a A k ??==为任意数,定义分块矩阵() ij r s A A ?=与k 的数乘为 () ij r s kA kA ?= 1.2.3乘法 设() () ,ij ij s n n m A a B b ??==分块为()(),ij ij r l l r A A B B ??==,其中ij A 是i j s n ?矩阵,ij B 是 i j n m ?矩阵,定义分块矩阵() ij r l A A ?=和()ij l r B B ?=的乘积为 () 1122...,1,2,...;1,2,3,...,ij i j i j il lj C A B A B A B i t j l =+++==.、 1.2.4转置 设() ij s n A a ?=分块为() ij r s A A ?=,定义分块矩阵() ij r s A A ?=的转置为 () ji s r A A ?''= 1.2.5分块矩阵的初等变换 分块矩阵A 的下列三种变换称为初等行变换:

2.2矩阵的运算及其性质

2.2矩阵的运算及其性质 课题 2矩阵的运算及其性质 时间 教学目的 学习矩阵相关的概念 重点难点 .矩阵概念;2特殊矩阵 时间 分配 教学过程 教学方法 教学手段 0ˊ一、导言: 矩阵的运算在矩阵的理论中起着重要的作用。它虽然不是数,但用来处理实际问题时往往要进行矩阵的代数运算。 二、新授: 2.2.1矩阵的加法 .定义2.2:两个矩阵相加等于把这两个矩阵的对应元素相加。应注意,并非任何两个矩阵都可以相加,只有当两个矩阵具有相同的行数和相同的列数时才能相加。2.矩阵

的加法满足下列运算律:。两个矩阵相减等于把这两个矩阵的对应元素相减。2.2.2数与矩阵的乘法 .定义2.3:一个数与矩阵相乘等于用这个数去乘矩阵的每一个元素。2.数与矩阵的乘法满足下列运算律:例3设,求。解:讲授法板演 2.2. 3.矩阵的乘法 .定义2.4:设两个矩阵,,则矩阵与矩阵的乘积记为,规定,其中2矩阵的乘法满足下列运算律:结合律:分配律:设是数,。例2设,,求,与。解:从例题中我们可以得出下面的结论:矩阵的乘法不满足交换律。即一般地说,。两个非零矩阵的乘积可能等于零。一般说来,不能推出或。矩阵乘法中消去律不成立。即,且,不能推出 .设是一个阶方阵,定义:称为的次方幂。由于矩阵的乘法适合结合律,所以方阵的幂满足下列运算律:;, 时间 分配 教学过程 教学方法 教学手段

其中,为正整数。又因为矩阵乘法一般不满足交换律,所以对两个阶方阵与,一般说来,。设是的一个多项式,为任意方阵,则称为矩阵的多项式2.2.4矩阵的转置1.定义2.5:设则矩阵称为的转置矩阵2.矩阵的转置是一种运算,它满足下列运算律:例9设BT=B,证明T=ABAT证明:因为BT=B,所以T=[AT]T=TT=ABTAT=ABAT3.定义2.6:设为阶方阵,如果,即有则称为对称矩阵。如果,即有,,则说为反对称矩阵。2.2.5n阶方阵的行列式1.定义2.7:由阶方阵所有元素构成的行列式,称为阶方阵的行列式,记作||或。2.阶行列式的运算满足下列运算律:;;。三、练习:习题2.22~4四、小结:本节介绍了矩阵的加、减、数乘、乘法、转置、方阵行列式的运算,这些运算矩阵理论中占有重要地位,特别是乘法运算,要熟练掌握这些运算。五、作业:课后记事本节应注重矩阵乘法的练习和证明题的训练,这始终是一个难点的地方。

线性代数中矩阵乘法的本质

线性代数中矩阵乘法的本质 一、线性空间 1.1线性的含义 线性代数里面的“线性”意思就是线性空间里的线性变换。线性变换或线性映射是把中学的线性函数概念进行了重新定义。中学里,函数f(x)=kx+b称为一元线性函数,因为在平面直角坐标系中这个函数的图形就是一条直线,所以把这种函数形象地称为“线性”函数。 在线性代数中,为了线性函数的进一步推广,把一元线性函数f (x)= kx + b中的b去掉,即只有过原点的最简单的直线f (x)= kx才被称为一元线性函数,这是因为不过原点的直线不满足我们对线性函数的比例性的要求。 线性函数的“线性”二字,体现在几何意义和代数意义2个方面:几何意义,线性就是指几何上是一条线,称为线性;而代数意义上,线性体现在①可加性(对加法封闭)②比例性(对数乘封闭)。 1.2、空间 空间的概念比较抽象,简单来说,能装东西的就是空间。数学上定义,里面装了可以运算的东西就是空间。从拓扑空间开始,一步步往上加定义,可以形成很多空间。就好像从水果这个泛型概念开始,一步步往上加定义,可以形成很多更加具体化的概念,如热带水果,甜的热带水果,苹果,红苹果等等。线形空间算是还是比较初级的,如果在里面定义了范数,就成了赋范线性空间;赋范线性空间满足完备性,就成了巴那赫空间;赋范线性空间中定义角度,就有了内积空间;内积空间再满足完备性,就得到希尔伯特空间;如果空间里装载所有类型的函数,就叫泛函空间。 空间有一些具体特征,就好像水果这个泛指的概念也有一些属性来描述一样,空间具有以下属性特征: ①由很多(实际上是无穷多个)位置点组成 ②这些点之间存在相对的关系 ③可以在空间中定义长度、角度

矩阵相乘并行算法

并行处理技术 课程设计分析报告 课程设计题目矩阵相乘并行算法设计姓名廖杰 学号M201372880 专业计算机技术 任课教师金海石宣化 所在学院计算机科学与技术学院报告提交日期2014-01-13

一、实验目的 1、学习使用集群; 2、掌握并行处理或分布计算的编程方法; 3、学会以并行处理的思想分析问题。 二、实验要求 1、自行生成矩阵作为算法的输入; 2、使用并行处理技术编程,例如:MPI、OpenMP、MR; 3、矩阵大小至少为1000*1000; 4、加速比越大成绩越高。 三、实验内容 3.1、矩阵的划分: 对于矩阵相乘的并行算法,可以有三种:对矩阵按行划分、按列划分和棋盘式分块划分。和按行或列划分相比,棋盘式划分可以开发出更高的并行度。对于一个n×n的方阵,棋盘划分最多可以使用n^2个处理器进行并行计算,但使用按行或列分解最多可以使用n个。对矩阵相乘采用棋盘式划分的算法通常称作Cannon算法。 A)行列划分 又叫带状划分(Striped Partitioning),就是将矩阵整行或者整列分成若干个组,每个组指派给一个处理器。下图所例为4个CPU,8×8矩阵的带状划分。

在带状划分情况下,每个CPU将会均匀分配到2行(列)数据。8×8矩阵变成了一个1×4或4×1的分块矩阵,每个CPU所属的分块矩阵大小为8×2或2×8。

B)棋盘划分 就是将矩阵分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或者整列。下图所示即为4个处理器情况下8×8矩阵的棋盘划分,其中处理器阵列为2×2,每个处理器分配到的子矩阵大小为4×4。 矩阵划分成棋盘状可以和处理器连成二维网孔相对应。对于一个n×n维矩阵和p×p的二维处理器阵列,每个处理器均匀分配有(n/p)×(n/p)=n^2/p^2个元素。使用棋盘式划分的矩阵相乘算法一般有两种,Cannon算法和Summa算法。SUMMA算法能够计算 m*l的A矩阵和l*n的B矩阵相乘(m、l、n可不相等),而cannon算法只能实现n*n 的A矩阵和n*n的B矩阵相乘,具有很大的局限性。 3.2、算法原理 A) 行划分法 假设是M*N,计算前,将矩阵N发送给所有从进程,然后将矩阵M分块,将M中数据按行分给各从进程,在从进程中计算M中部分行数据和N的乘积,最后将结果发送给主进程。这里为了方便,有多少进程,就将M分了多少块,除最后一块外的其他数据块大小都相等,最后一块是剩下的数据,大小大于等于其他数据块大小,因为矩阵行数不一定整除进程数。最后一块数据在主进程中计算,其他的在从进程中计算。 定义两个矩阵M和N,N所有进程都需要,M可以只在主进程中定义。其他的变量视主进程和从进程需要按要求定义在合适的位置。

矩阵的运算及其运算规则

矩阵基本运算及应用 201700060牛晨晖 在数学中,矩阵就是一个按照长方阵列排列得复数或实数集合、矩阵就是高等代数学中得常见工具,也常见于统计分析等应用数学学科中、在物理学中,矩阵于电路学、力学、光学与量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。矩阵得运算就是数值分析领域得重要问题。将矩阵分解为简单矩阵得组合可以在理论与实际应用上简化矩阵得运算。在电力系统方面,矩阵知识已有广泛深入得应用,本文将在介绍矩阵基本运算与运算规则得基础上,简要介绍其在电力系统新能源领域建模方面得应用情况,并展望随机矩阵理论等相关知识与人工智能电力系统得紧密结合。 1矩阵得运算及其运算规则 1。1矩阵得加法与减法 1、1、1运算规则 设矩阵,,?则 ?简言之,两个矩阵相加减,即它们相同位置得元素相加减!?注意:只有对于两个行数、列数分别相等得矩阵(即同型矩阵),加减法运算才有意义,即加减运算就是可行得. 1。1、2运算性质 满足交换律与结合律

交换律;?结合律. 1.2矩阵与数得乘法 ?1。2、1运算规则?数乘矩阵A,就就是将数乘矩阵A中得每一个元素,记为或.?特别地,称称为得负矩阵。 1。2、2运算性质?满足结合律与分配律?结合律:(λμ)A=λ(μA);(λ+μ)A=λA+μA.?分配律:λ(A+B)=λA+λB. 1、2、3典型举例?已知两个矩阵 满足矩阵方程,求未知矩阵、?解由已知条件知 1、3矩阵与矩阵得乘法 ?1。3.1运算规则?设,,则A与B得乘积就是这样一个矩阵: (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即. (2) C得第行第列得元素由A得第行元素与B得第列元素对应相乘,再取乘积之与、 1、3、2典型例题

分块矩阵及其应用汇总

分块矩阵及其应用 徐健,数学计算机科学学院 摘要:在高等代数中,分块矩阵是矩阵内容的推广. 一般矩阵元素是数量, 而分块矩阵则是将大矩阵分割成小矩形矩阵,它的元素是每个矩阵块.分块矩阵的引进使得矩阵工具的利用更加便利,解决相关问题更加强有力,所以其应用也更广泛. 本文主要研究分块矩阵及其应用,主要应用于计算行列式、解决线性方程组、求矩阵的逆、证明与矩阵秩有关的定理. 关键词:分块矩阵;行列式;方程组;矩阵的秩 On Block Matrixes and its Applications Xu Jian, School of Mathematics and Computer Science Abstract In the higher algebra, block matrix is a generalization of matrix content. In general, matrix elements are numbers. However, the block matrix is a large matrix which is divided into some small rectangular matricies, whose elements are matrix blocks. The introduction of the block matrix makes it more convenient to use matrix, and more powerful to solve relevant problems. So the application of the block matrix is much wider. This paper mainly studies the block matrix and its application in the calculation of determinant, such as solving linear equations, calculating inverse matrix, proving theorem related to the rank of matrix , etc. Keywords Block matrix; Determinant; System of equations; Rank of a matrix

矩阵相乘的并行算法的设计与实现

仲恺农业工程学院实验报告纸 计算机科学与工程学院(院、系)网络工程专业083 班组并行计算应用试验课 学号:200810224311 姓名:李志冬实验日期:2011-05-19 教师评定实验三矩阵相乘的并行算法的设计与实现 一、实验目的 理解和掌握矩阵相乘的并行算法的设计思想以及实现原理 二、实验内容 编译和运行一个两矩阵相乘算法的并行程序 三、实验步骤 1 使用vi编辑器输入并行计算的代码,保存在multi.c中 #include #include "mpi.h" #define NRA 62 #define NCA 15 #define NCB 7 #define MASTER 0 #define FROM_MASTER 1 #define FROM_WORKER 2 MPI_Status status; int main(int argc, char *argv[]) { int numtasks, taskid, numworkers, source, dest, nbytes, mtype,

dbsize, rows, averow,extra,offset, i,j,k, count; double a[NRA][NCA],b[NCA][NCB],c[NRA][NCB]; intsize = sizeof(int); dbsize = sizeof(double); MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&taskid); MPI_Comm_size(MPI_COMM_WORLD,&numtasks); numworkers = numtasks-1; if(taskid==MASTER) { printf("Number of worker tasks = %d\n",numworkers); for(i=0;i

相关主题
文本预览
相关文档 最新文档