zoukankan      html  css  js  c++  java
  • [模板] 矩阵乘法,矩阵快速幂,矩阵幂

    1.普通乘法

    当且仅当方阵A行等于方阵B列时才可以进行矩阵乘法运算。

    #include <iostream>
    using namespace std;
    int a[300][300];
    int b[300][300];
    int ans[300][300];
    int main()
    {
    	int m,s,n;
    	cin>>m>>s>>n;
    	for(int i = 0;i < m; i++)
    		for(int j = 0;j < s; j++)
    			cin>>a[i][j];
    	for(int i = 0;i < s; i++)
    		for(int j = 0;j < n; j++)
    			cin>>b[i][j];
    	for(int i = 0;i < m; i++)
    	{
    		for(int j = 0;j < n; j++)
    		{
    			int tmp = 0;
    			for(int k = 0;k < s; k++)
    			{
    				tmp += a[i][k] * b[k][j];    //核心算法
    			}
    			ans[i][j] = tmp;
    		}
    	}
    	for(int i = 0; i < m; i++)
    	{
    		for(int j = 0;j < n; j++)
    		{
    			cout<<ans[i][j]<<' ';
    		}
    		cout<<endl;
    	}
    	return 0;
    }

    2.方幂乘法

    只有方阵才可以进行幂运算

    1·朴素算法

    #include <iostream>
    using namespace std;
    int a[1010][1010] = {0};
    int b[1010][1010] = {0};
    int ans[1010][1010] = {0};
    int n,m;
    int main()
    {
    	cin>>n>>m;
    	for(int i = 0; i < n; i++)
    		for(int j = 0; j < n; j++)
    			cin>>a[i][j];
    	if(m == 0)
    	{
    		for(int i = 0;i < n; i++)
    		{
    			for(int j = 0;j < n; j++)
    			{
    				if(i == j)
    					cout<<1<<' ';     //1000
    				else                      //0100
    					cout<<0<<' ';     //0010
    			}                                 //0001
    			cout<<endl;
    		}
    		return 0;
    	}
    	if(m == 1)
    	{
    		for(int i = 0;i < n; i++)
    		{
    			for(int j = 0; j < n; j++)
    			{
    				cout<<a[i][j]<<' ';
    			}
    			cout<<endl;
    		}
    		return 0;
    	}
    	m--;
    	int flag = 0;
    	while(m--)
    	{
    		if(!flag)
    			memcpy(b,a,sizeof(a));
    		else
    			memcpy(b,ans,sizeof(a));
    		for(int i = 0;i < n; i++)
    		{
    			for(int j = 0; j < n; j++)
    			{
    				int tmp = 0;
    				for(int k = 0; k < n; k++)
    				{
    					tmp += a[i][k] * b[k][j];//核心计算
    					ans[i][j] = tmp;
    				}
    			}
    		}
    		flag = 1;
    	}
    	for(int i = 0; i < n; i++)
    	{
    		for(int j = 0;j < n; j++)
    		{
    			cout<<ans[i][j]<<' ';
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    

    2·快速幂

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int MAXN = 110;
    const int MOD = 1e9 + 7;
    typedef long long ll;
    
    struct mat				 //构建矩阵结构体 
    {
    	ll arr[MAXN][MAXN];
    	void reset()		 //重置为E矩阵 
    	{
    		for(int i = 0; i < MAXN; i++)
    		{
    				arr[i][i] = 1;
    		}
    	}
    };
    
    mat mul(mat x, mat y, int n)		//乘法运算 
    {
    	mat ans;
    	for(int i = 0; i < n; i++)
    	{
    		for(int j = 0; j < n; j++)
    		{
    			ans.arr[i][j] = 0;
    			for(int k = 0; k < n; k++)
    			{
    				ans.arr[i][j] += (x.arr[i][k] * y.arr[k][j]) % MOD;
    			}
    			ans.arr[i][j] %= MOD;
    		}
    	}
    	return ans;
    }
    
    mat  qpow(mat a, int m, int n) //快速幂 
    {
    	mat ans;
    	ans.reset();
    	while(m)
    	{
    		if(m & 1)
    			ans = mul(ans, a, n);
    		a = mul(a, a, n);
    		m /= 2;
    	}
    	return ans;
    }
    int main()
    {
    	mat a;
    	int n, m; //n为方阵维数, m为幂次数 
    	cin>>n>>m;
    	for(int i = 0; i < n; i++)
    	{
    		for(int j = 0; j < n; j++)
    		{
    			cin>>a.arr[i][j];
    		}
    	}
    	
    	mat ans = qpow(a, m, n);
    	
    	for(int i = 0; i < n; i++)
    	{
    		for(int j = 0; j < n; j++)
    		{
    			cout<<ans.arr[i][j]<<' ';
    		}
    		cout<<endl;
    	}
    	return 0;
    }

    模板

  • 相关阅读:
    20165320 第四次实验 Android开发
    20165320 第十周课上测试补做
    20165320 第九周课下测试补做
    20165320 Java实验三:敏捷开发与XP实践
    20165320 第九周学习总结
    20165320 第八周课下补做
    20165320 结对编程第二周
    20165320 第八周学习总结
    20165329 Java实验二:面向对象编程
    第十周课上测试补做
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270770.html
Copyright © 2011-2022 走看看