1141 BASIC-17 矩阵乘法

题目描述

 给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22

输入

 第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

输出

 输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开

样例输入

2 2
1 2
3 4

样例输出

7 10
15 22

#include<stdio.h>
int main()
{
	int N,M,j,i,k;
	int b[30][30],a[30][30],t[30][30];
	while(~scanf("%d %d",&N,&M))
	{
		for(i=0;i<N;i++)
		{
		  for(j=0;j<N;j++)
		  {
		     scanf("%d",&b[i][j]);
		     a[i][j]=b[i][j];
		  }
	    }
	    if(M==0)
	    {
	    	for(i=0;i<N;i++)
	    	{
	    	  for(j=0;j<N;j++) 
			  {
			     
	    		if(i==j)
	    		  b[i][j]=1;
	    		else
	    		  b[i][j]=0;
	    	   }
			}
		}
		else
		{ 
		  while(--M)
		  {
			for(i=0;i<N;i++)
		     {
		       for(j=0;j<N;j++)
		         {
		         	for(k=0;k<N;k++)
		         	  {
		         	  	t[i][j]+=b[i][k]*a[k][j];
					  }
				  }
	          }
	         for(i=0;i<N;i++)
		        {
		          for(j=0;j<N;j++)
		            {
		              b[i][j]=t[i][j];
		              t[i][j]=0;
		            }
    	        }
            }
        }
        for(i=0;i<N;i++)
          {
          	for(j=0;j<N;j++)
          	{
          	  printf((j+1)!=N?"%d ":"%d\n",b[i][j]);	
			}
		  }
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个利用openBLAS进行矩阵乘法并循环展开的例子。 下面是一个使用openBLAS进行矩阵乘法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <cblas.h> #define N 1024 #define M 1024 #define K 1024 #define LOOP 500 int main() { float *A, *B, *C; int i, j, k, loop; double start, end; A = (float*)malloc(sizeof(float) * N * K); B = (float*)malloc(sizeof(float) * K * M); C = (float*)malloc(sizeof(float) * N * M); srand(time(NULL)); for (i = 0; i < N * K; i++) A[i] = (float)rand() / RAND_MAX; for (i = 0; i < K * M; i++) B[i] = (float)rand() / RAND_MAX; memset(C, 0, sizeof(float) * N * M); start = clock(); for (loop = 0; loop < LOOP; loop++) { for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { for (k = 0; k < K; k++) { C[i * M + j] += A[i * K + k] * B[k * M + j]; } } } } end = clock(); printf("Time of loop unrolling: %.2f ms\n", (end - start) / CLOCKS_PER_SEC / LOOP * 1000); memset(C, 0, sizeof(float) * N * M); start = clock(); for (loop = 0; loop < LOOP; loop++) { cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N, M, K, 1.0f, A, K, B, M, 0.0f, C, M); } end = clock(); printf("Time of openBLAS: %.2f ms\n", (end - start) / CLOCKS_PER_SEC / LOOP * 1000); free(A); free(B); free(C); return 0; } ``` 在这个例子中,我们生成了三个矩阵A、B和C。然后我们使用循环展开的方法和openBLAS中的cblas_sgemm函数来计算矩阵乘积。我们使用clock函数来计算两种方法的运行时间,并进行比较。 在循环展开的方法中,我们使用三重循环遍历矩阵A和B,然后计算矩阵乘积C。在openBLAS中,我们使用cblas_sgemm函数来计算矩阵乘积C。这个函数使用BLAS(Basic Linear Algebra Subprograms)库来加速矩阵运算。 在本例中,我们使用了循环展开的方法和openBLAS来计算矩阵乘积。实际上,openBLAS是更优秀的选择,因为它使用了高效的算法和优化技术,可以大大加速矩阵运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值