矩阵

这篇博客介绍了矩阵的概念,包括同型矩阵、n阶矩阵、行矩阵、列矩阵、零矩阵和单位矩阵。此外,还探讨了矩阵的计算操作,如加、减、乘,并提到了矩阵快速幂在解决斐波那契数列问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

在这里插入图片描述

常见用语

同型矩阵

两个矩阵A,B,如果都是m行n列的,称他们是同型矩阵

n阶矩阵

n行n列的矩阵,称为n阶矩阵或方阵

行矩阵:只有一行的矩阵
列矩阵:只有一列的矩阵
零矩阵:元素都是0的矩阵
单位矩阵

从左上角到右下角的直线(叫做主对角线)上元素都是1,其他元素都是0

计算

在这里插入图片描述

在这里插入图片描述

矩阵乘数:
在这里插入图片描述
矩阵乘矩阵:

在这里插入图片描述
矩阵快速幂(模板)

#include<bits/stdc++.h>
#define ll long long
#define db double
#define mod 1000000007
using namespace std;
inline ll read()
{
	ll x=0,f=1;
	char ch;
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
ll n,k;
struct matrix
{
	ll a[105][105];
	matrix(int t=0)
	{
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++)	a[i][i]=t;
	}
	inline matrix operator *(const matrix &A)
	{
		matrix ans(0);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				for(int k=1;k<=n;k++)
				{
					ans.a[i][j]=(ans.a[i][j]+a[i][k]*A.a[k][j]%mod)%mod;
				}
			}
		}
		return ans;
	}
	friend inline matrix operator ^(matrix A,ll b)
	{
		matrix ans(1);
		while(b)
		{
			if(b&1)	ans=ans*A;
			A=A*A;
			b/=2;
		}
		return ans;
	}
}A;
int main()
{
	n=read();
	k=read();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			A.a[i][j]=read();
		}
	}
	A=A^k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%lld ",A.a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

例题:求斐波那契数列的第n项;

在这里插入图片描述
代码:

#include<bits/stdc++.h>
#define ll long long
#define db double
#define mod 1000000007
using namespace std;
inline ll read()
{
	ll x=0,f=1;
	char ch;
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
ll n;
struct matrix
{
	ll a[3][3];
	matrix(){memset(a,0,sizeof(a));}
	inline matrix operator *(const matrix &A)const
	{
		matrix ans;
		for(int i=1;i<=2;i++)
		{
			for(int j=1;j<=2;j++)
			{
				for(int k=1;k<=2;k++)
				{
					ans.a[i][j]=(ans.a[i][j]+a[i][k]*A.a[k][j]%mod)%mod;
				}
			}
		}
		return ans;
	}
	friend inline matrix operator ^(matrix A,ll b)
	{
		matrix e;
		e.a[1][1]=1;
		e.a[1][2]=0;
		e.a[2][1]=0;
		e.a[2][2]=1;
		while(b)
		{
			if(b&1)	e=A*e;
			A=A*A;
			b/=2;
		}
		return e;
	}
};
int main()
{
	n=read();
	if(n<=2)
	{
		printf("1");
		return 0;
	}
	matrix ans;
	ans.a[1][1]=1;
	ans.a[1][2]=1;
	ans.a[2][1]=1;
	ans.a[2][2]=0;
	ans=ans^(n-1);
	printf("%lld\n",ans.a[1][1]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值