码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵乘法

时间:2015-04-15 21:28:19      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

矩阵乘法

时间限制:1.0s   内存限制:512.0MB

问题描述:给定一个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>
#include <stdlib.h>

void calende();

int line,mi;
int jc[30][30]={0};
int jce[30][30]={0};
int jcen[30][30]={0};

int main()
{
	int i,j;
	scanf("%d %d",&line,&mi);
	for(i=0;i<line;i++)
	{
		for(j=0;j<line;j++)
		{
			scanf("%d",&jc[i][j]);
			jce[i][j]=jc[i][j];
		}
	}
	if(mi==0)
	for(i=0;i<line;i++)
	{
		jcen[i][i]=1;
	}
	calende();
	return 0;
}
void calende()
{
	int i,j,z,d; 
	for(i=2;i<=mi;i++)//幂 
	{
		for(j=0;j<line;j++)//遍历行 
		{
			for(z=0;z<line;z++)//遍历列 
			{
				for(d=0;d<line;d++)
				{
					jcen[j][z]+=jce[j][d]*jc[d][z];	
				}	
			}
		}
		if(i==mi)break;
		for(j=0;j<line;j++)//遍历行 
		{
			for(z=0;z<line;z++)//遍历列 
			{
			    jce[j][z]=jcen[j][z];
			    jcen[j][z]=0;
			}
		} 
	}
	if(mi==1||mi==0)
	{
	 	for(j=0;j<line;j++)//遍历行 		  
		{
			for(z=0;z<line;z++)//遍历列 
			{
				if(mi==1)
				   printf("%d ",jc[j][z]);	
   			    else 
				   printf("%d ",jcen[j][z]);
			}
			printf("\n");
		}
	}
	else
	{
		for(j=0;j<line;j++)//遍历行 
		{
			for(z=0;z<line;z++)//遍历列 
			{
			    jce[j][z]=jcen[j][z];
			    jcen[j][z]=0;
				printf("%d ",jce[j][z]);	
			}
			printf("\n");
		}
	}	
}



#include <iostream>
using namespace std;

void calende();
void show();
void getinfo(int **);
void getinfo1(int **);
void cleanms(int **);
void cleanms1(int **);

int line,mi;
int **jc=NULL;
int **jce=NULL;
int **jcen=NULL;

int main()
{
	int i,j;
	cin>>line>>mi;
	getinfo1(jc);
	getinfo1(jce);
	getinfo1(jcen);
	for(i=0;i<line;i++)
	{
		for(j=0;j<line;j++)
		{
			cin>>jc[i][j];
		}
	}
	for (int z = 0; z < line; z++) 
	{  
	   jce[z][z] = 1;  
	}    
	calende();
	show();
	cleanms1(jc);
	cleanms1(jce);	
	cleanms1(jcen);	
	
	return 0;
}
void calende()
{ 
    for (int i = 0; i < mi; i++) 
	{           
        for (int j = 0; j < line; j++) 
		{  
            for (int j2 = 0; j2 < line; j2++) 
			{  
                for (int k = 0; k < line; k++) 
				{  
                    jcen[j][j2] += jce[j][k] * jc[k][j2];  
                }  
            }  
        }  
        for (int j = 0; j < line; j++)
		{  
            for (int j2 = 0; j2 < line; j2++) 
			{  
                jce[j][j2] = jcen[j][j2]; 
				jcen[j][j2]=0; 
            }  
        }  
    }   	
}
void show()
{
	for (int i = 0; i < line; i++) 
	{  
        for (int j = 0; j < line; j++) 
		{  
            cout<<jce[i][j]<<" ";  
        } 
		cout<<endl; 
	} 
}
void getinfo(int **p)//内存不连续 
{
	p=new int*[line];
	for(int i=0;i<line;i++)
	{
		p[i]=new int[line];
	}
} 
void getinfo1(int **a)//保证内存的连续性 
{
	a = new int* [line];
	a[0] = new int[line * line]; 
	for(int i=1; i<line; i++)
	{
	   a[i] = a[i-1] + line; 
	}
}
void cleanms(int **p)
{
	for(int i=0; i<line; i++)
	delete[] p[i];
	delete[] p;
} 
void cleanms1(int **a)
{
	delete[] a[0];
	delete[] a;
}


(全文完)

矩阵乘法

标签:

原文地址:http://blog.csdn.net/confidence_surmount/article/details/45064969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!