矩阵运算学习笔记

发布于 22 天前  15 次阅读


定义

什么是矩阵运算?

  • 矩阵是一个按照长方阵列排列的复数或实数集合

logo

  • 矩阵行数不一定等于列数

  • 共有m×n个元素

  • 本质上是一个数表

复数实数什么的我们先不管,总之,矩阵就是一堆数,按照矩形排列形成的集合。

那么,我们所需要记录的也就是它的长、宽以及矩阵中存储的元素。

当两个矩阵的长宽相等时,我们认为这两个矩阵为同型矩形。

特殊矩阵

img

3.元素全为0的矩阵称为零矩阵,可记作 O

img

矩阵和行列式

上一篇写的是行列式,讲完矩阵的定义,来看看两者之间的区别和关联

行列式 矩阵
logo logo
  • 矩阵是一个数表,行列式一般是一个数值

  • 矩阵的行数列数可不相等,行列式的行数列数必须相等

  • 只有方阵才可以求其行列式

  • 两矩阵相等:两同型矩阵的对应元素相同

  • 两行列式相等:只要其值相等.不要求它们是同阶行列式,也不要求对应元素相等.

矩阵的运算

矩阵的运算我们可以类比实数的运算来理解。在实数运算中,一般由进行运算的实数和运算符组成,运算符决定了运算类型。那么同样的,矩阵运算也是如此。

加法运算

首先,我们来看加法运算

两个矩阵进行一般的加法运算的前提是两个矩阵为同型矩阵

我们只需要将对应位置的元素相加即可,如下图

avetar

矩阵加法运算的规律

img img

 数与矩阵相乘

定义:数λ与矩阵A的乘积记作 λAAλ 

img img img

矩阵乘法(矩阵乘矩阵)

由以上规律,那么矩阵乘矩阵是不是就是两个同型矩阵的对应元素相乘呢?

naive

两个矩阵相乘的前提是前一个矩阵的列数等于后一个矩阵的行数

* 第一种写法

设A为n×k矩阵,B为k×m矩阵,那么它们的乘积C则为一个n×m矩阵

img

* 第二种写法

img

  • 举个例子

img img img

写作代码:

    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            for (int k=1;k<=tmp;k++)
                c.m[i][j]=c.m[i][j]+x.m[i][k]*y.m[k][j];

矩阵的转置

img img img

方阵的行列式

img

例题 矩阵快速幂

题目地址

#include<iostream>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;
struct Mat
{
	ll m[101][101];
};
Mat a,e;//a是输入的矩阵,e是单位矩阵
ll n,p;
Mat Mul(Mat x,Mat y) //矩阵乘
{
	Mat c;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			c.m[i][j]=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;
	return c; 
}
Mat pow(Mat x,ll y) //矩阵快速幂
{
	Mat ans=e;
	while(y)
	{
		if(y&1)
		ans=Mul(ans,x);  
		x=Mul(x,x);
		y>>=1;
	}
	return ans;
}

int main()
{
	cin>>n>>p;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a.m[i][j];
	for(int i=1;i<=n;i++)
		e.m[i][i]=1;//单位矩阵
	Mat ans=pow(a,p);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			cout<<ans.m[i][j]%mod<<" ";
		cout<<endl;
	}
	return 0;
}