算法——矩阵算法

article/2025/9/17 3:25:42

目录

  • 一.矩阵快速幂
    • (1)矩阵定义
    • (2)加法运算
    • (3)减法运算
    • (4)数乘
    • (5)P3390 【模板】矩阵快速幂
  • 二.矩阵求斐波那契数列
  • 三.[一个详解矩阵各种高难应用的博客]

一.矩阵快速幂

(1)矩阵定义

什么是矩阵运算呢?

在理解这个问题前,我们先要知道什么是矩阵

百度百科给的定义如下

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

复数实数什么的我们先不管,总之,矩阵就是一堆数,按照矩形排列形成的集合
那么,我们所需要记录的也就是它的长、宽以及矩阵中存储的元素特殊的,长宽相等的矩阵我们定义它为方阵当两个矩阵的长宽相等时,我们认为这两个矩阵为同型矩形。

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

(2)加法运算

首先,我们来看加法运算
两个矩阵进行一般的加法运算的前提是两个矩阵为同型矩阵
我们只需要将对应位置的元素相加即可,如下图
在这里插入图片描述

在矩阵的加法运算中,满足交换律和结合律,也就是
A + B = B + A A + B = B + A A+B=B+AA+B=B+A A+B=B+AA+B=B+A
( A + B ) + C = A + ( B + C ) ( A + B ) + C = A + ( B + C ) (A+B)+C=A+(B+C)(A+B)+C=A+(B+C) (A+B)+C=A+(B+C)(A+B)+C=A+(B+C)
也许有人想问了,如果我想让两个非同型矩形进行相加可不可以实现呢?

答案是可以的,这种运算是被支持的,我们称这种运算为直和

但由于这种运算使用较少,且与本文关系不大,我们在此不多做解释,感兴趣的朋友可以阅览下面的链接,相信它会给你一个满意的答复

矩阵加法

(3)减法运算

在实数运算中,减法为加法的逆运算,同样的,在矩阵运算中也是如此,如下图

在这里插入图片描述

(4)数乘

在实数运算中我们并没有数乘这种运算(毕竟本身就是数,直接叫乘法了)

所以在数乘运算中,我们类比向量来进行理解

在数乘向量运算中,只需要将向量中的每个元素乘上那个数就可以了

数乘矩阵也是如此,如图

数乘矩阵运算中,满足如下运算律
( λ μ ) A = λ ( μ A ) ( λ μ ) A = λ ( μ A ) (\lambda\mu)A=\lambda(\mu A)(λμ)A=λ(μA) (λμ)A=λ(μA)(λμ)A=λ(μA)
( λ + μ ) A = λ A + μ A ( λ + μ ) A = λ A + μ A (\lambda+\mu)A=\lambda A+\mu A(λ+μ)A=λA+μA (λ+μ)A=λA+μA(λ+μ)A=λA+μA
λ ( A + B ) = λ A + λ B λ ( A + B ) = λ A + λ B \lambda(A+B)=\lambda A+\lambda Bλ(A+B)=λA+λB λ(A+B)=λA+λBλ(A+B)=λA+λB
矩阵乘法(矩阵乘矩阵)
在向量乘向量的运算中,是将每个元素与它对应的元素相乘,求所有乘积之和

那么矩阵乘矩阵是不是就是两个同型矩阵的对应元素相乘呢?

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

举个栗子, A为 nk矩阵, B 为 km 矩阵, C 为 m*n 矩阵,那么 A 可以与 BB 相乘, B 可以与 C 相乘, C 可以与 A 相乘,其他均不成立

我们知道了什么情况下两个矩阵可以相乘,那么他们怎么相乘呢?不讲每个对应位置相乘还能怎么乘呢?

设 A 为 n*k矩阵, B 为 k∗m 矩阵,那么它们的乘积 C 则为一个 n∗m 矩阵
C i , j = ∑ r = 1 k A i , r ∗ B r , j C i , j ​ ​ C_{i,j}=\sum_{r=1}^kA_{i,r}*B_{r,j}C _{i,j} ​ ​ Ci,j=r=1kAi,rBr,jCi,j
是不是不太好理解,没关系看看图就知道了
在这里插入图片描述

在矩阵乘法中满足以下运算律:
( A B ) C = a ( B C ) ( A B ) C = a ( B C ) (AB)C=a(BC)(AB)C=a(BC) (AB)C=a(BC)(AB)C=a(BC)
( A + B ) C = A C + B C ( A + B ) C = A C + B C (A+B)C=AC+BC(A+B)C=AC+BC (A+B)C=AC+BC(A+B)C=AC+BC
C ( A + B ) = C A + C B C ( A + B ) = C A + C B C(A+B)=CA+CBC(A+B)=CA+CB C(A+B)=CA+CBC(A+B)=CA+CB
在普通的乘法中,一个数乘1还是等于它本身,在矩阵乘法中也有这么一个“1”,它就是单位矩阵

不同于普通乘法中的单位1,对于不同矩阵他们的单位矩阵大小是不同的

对于 nm 的矩阵,它的单位矩阵大小为m∗m ,对于m∗n 的矩阵,它的单位矩阵大小为 nn

也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同

单位矩阵的元素非0即1,从左上角到右下角的对角线上元素皆为1,其他皆为0

了解了这么多,我们开始看题

(5)P3390 【模板】矩阵快速幂

P3390 【模板】矩阵快速幂
题目背景
矩阵快速幂
题目描述
给定 n×n 的矩阵 A,求 Ak
输入格式
第一行两个整数 n,k接下来 n 行,每行 n 个整数,第 i行的第 j的数表示Ai,j
输出格式
输出 Ak
共 n 行,每行 n 个数,第i行第 j 个数表示 (Ak)i,j ,每个元素对 109+7取模。
矩阵快速幂,由于矩阵乘法满足结合律,所以我们只需要把它按照一般的快速幂打,再重载一下运算符就可以了,好了我们直接放代码

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
const ll N=1e2+7;
ll n;
inline ll read()//快读
{ll a=0;ll f=0;char ch=getchar();while(!isdigit(ch)){f|ch=='-';ch=getchar();}while(isdigit(ch)){a=(a<<3)+(a<<1)+(ch^48);ch=getchar();}return f?-a:a;
}
struct node
{ll a[N][N];//下面的这个函数就是每次定义一个新的node类型的数的时候这个函数就会被调用node(){memset(a,0,sizeof a);}//每定义一个node类型的值的时候,就把a数组置零,不然之前的会将其覆盖inline void build(){for(int i=1;i<=n;i++)a[i][i]=1;//给a数组初始化(因为是矩阵乘法,要初始为1而不是0)}
}date;
node operator*(const node &x,const node &y)//重载乘法运算符
{node z;for(int k=1;k<=n;k++)//矩阵乘法是x的i,k乘以y的k,j;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;return z;
}
int main()
{ll k;n=read();k=read();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)date.a[i][j]=read();node ans;ans.build();do{if(k&1)ans=ans*date;date=date*date;//重载的运算符*不能缩写为 * =k>>=1;}while(k);for(int i=1;i<=n;puts(""),i++)for(int j=1;j<=n;j++)cout<<ans.a[i][j]<<" ";return 0;
}

二.矩阵求斐波那契数列

P1962 斐波那契数列
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
F n = { 1 ( n ≤ 2 ) F n − 1 + F n − 2 ( n ≥ 3 ) F_n = \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}+F_{n-2} \space (n\ge 3) \end{aligned}\right. Fn={1 (n2)Fn1+Fn2 (n3)
题目描述
请你求出 Fnmod 109 + 7的值。

输入格式
一行一个正整数 n

输出格式
输出一行一个整数表示答案。

输入输出样例
输入:

10

输出:

55

详细解析

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
const ll N=1e2+7;
ll n;
inline ll read()
{ll a=0;ll f=0;char ch=getchar();while(!isdigit(ch)){f|ch=='-';ch=getchar();}while(isdigit(ch)){a=(a<<3)+(a<<1)+(ch^48);ch=getchar();}return f?-a:a;
}
struct Matrix
{ll a[3][3];Matrix(){memset(a,0,sizeof a);}Matrix operator*(const Matrix &b)const{Matrix res;for(int k=1;k<=2;++k)for(int i=1;i<=2;++i)for(int j=1;j<=2;++j)res.a[i][j]=(res.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;return res;}
}ans,base;
void init()
{base.a[1][1] = base.a[1][2] = base.a[2][1] = 1;ans.a[1][2] = ans.a[1][1] = 1;
}
void qpow(ll x)
{while(x){if(x&1)ans=ans*base;base=base*base;x>>=1;}
}
int main()
{n=read();if(n<=2) return puts("1"),0;init();qpow(n-2);cout<<ans.a[1][1]%mod;
}

参考

三.[一个详解矩阵各种高难应用的博客]

一个详解矩阵各种高难应用的博客

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧


http://chatgpt.dhexx.cn/article/DcwJI9lt.shtml

相关文章

python中的除法运算_python中矩阵除法运算的三种实现方法

介绍过python矩阵的乘法运算&#xff0c;numpy库中虽然乘法是矩阵运算的主要运算&#xff0c;但是numpy作为python中实现矩阵运算的好工具&#xff0c;也是可以轻松实现除法计算的&#xff0c;本文python中矩阵除法的三种实现方法&#xff1a;1、x/y计算对应元素相除(矩阵点除)…

矩阵算法之矩阵乘法

矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。 在矩阵乘法中&#xff0c;A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。 运算规则&#xff1a;A的每一行中的数字对应乘以B的每一列的数字把结果相加起来。 定义 注意事项 1、当矩阵…

MATLAB数值计算——矩阵运算乘法、除法、乘方

一、矩阵 矩阵是线性代数的基本单元矩阵含有M行N列数值矩阵中的元素可以是实数或复数矩阵相关的基本运算&#xff1a;加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 二、矩阵的运算 2.1、矩阵的乘法运算 运算符&#xff1a; * %矩阵乘法 …

第三章 矩阵运算

矩阵运算 生成矩阵如何生成数值矩阵 如何生成复数矩阵矩阵变换矩阵求值矩阵的特征值和特征向量稀疏矩阵 矩阵是数组的一种表现形式。 生成矩阵 两种方式&#xff1a;1.枚举式直接赋值法。2.用函数 如何生成数值矩阵 1.实数矩阵输入规则 所有元素都要放在“[ ]”中&#xff1…

两个元素的矩阵乘除法

矩阵的乘除法&#xff1a; 1 矩阵相乘&#xff0c;两个矩阵只有当左边的矩阵的列数等于右边矩阵的行数时,两个矩阵才可以进行矩阵的乘法运算 主要方法就是&#xff1a;用左边矩阵的第一行&#xff0c;逐个乘以右边矩阵的列&#xff0c;第一行与第一列各个元素的乘积相加&#x…

线性代数代码实现(六)矩阵除法(C++)

前言&#xff1a; 距离上一篇文章发布已经五天过去了&#xff0c;在这里先给一直等待的伙伴们说声抱歉&#xff0c;因为博主最近的事情很多&#xff0c;只好暂时停更&#xff0c;望大家理解&#xff01;上一篇文章中&#xff0c;我们介绍了求解逆矩阵的方法&#xff0c;我提到&…

Comsol 2020全套教学视频 教程入门讲解新手的福音

本视频为官方中文教学视频&#xff0c;给各位想学仿真的同学提供一点福音。本培训视频共有59个视频&#xff0c;本分享提供了前4节基础强化视频&#xff0c;如有需要剩下的各个板块的内容请评论区留言。 百度云链接&#xff1a;https://pan.baidu.com/s/16CdQY77zJ2akNpJxNTlvO…

COMSOL中文指导教程全集

个人体会&#xff0c;学习COMSOL&#xff0c;案例教学最有效&#xff0c;首先从官方案例入手&#xff0c;然后是几何建模教程、网格划分教程、后处理教程&#xff0c;学完这四个部分你基本就入门了。再结合自己的研究方向多学几个案例&#xff0c;基本就可以熟练了。 最有用的…

COMSOL安装教程

点击安装包路径下的setup.exe文件。COMSOL5.2\COMSOL_Multiphysics_5.2-SSQ\COMSOL_5.2_DVD的 setup.exe 选择简体中文 选择新安装COMSOL 5.2 允许用户协议&#xff0c;将许可证格式修改为“许可证文件”&#xff0c;然后点击浏览载入安装包中“_SolidSQUAD_”目录下的“Coms…

comsol_multiphysics入门教程

COMSOL Multiphysics简介 COMSOL的起源:COMSOL最先是Matlab的一个工具箱(Toolbox)&#xff0c;叫做Toolbox 1.0。后来改名为Femlab 1.0(FEM为有限元&#xff0c;LAB是取用的Matlab)&#xff0c;这个名字也一直沿用到Femlab 3.1。 发展至今&#xff0c;COMSOL当前有一个基本模块…

COMSOL建立孔隙尺度多孔介质结构模型教程 AbyssFish

首先获取一张多孔介质图片&#xff0c;这里就以COMSOL官网教程图片为例了。 通过软件将png格式的图片转换为DXF格式文件&#xff0c;也就是AutoCAD支持的文件&#xff1a; 下一步打开COMSOL软件建立二维模型&#xff0c;导入事先准备好的dxf模型&#xff0c;需要注意导入选项…

comsol学习中心:定义与材料选择

显示选择 在几何选项中的选择栏的第一个。 创建显示选择&#xff0c;选择你要选择的几何&#xff0c;这样&#xff0c;被选择的几何就被包含在一个标签中。 注意这里非几何实体层选择的是域 同样的也可以添加空气的。 这样就可以在选择的时候直接根据标签选择&#xff0c;不…

Comsol Multiphysics安装步骤详解

安装步骤&#xff1a; 安装前先关闭杀毒软件和360卫士&#xff0c;注意安装路径不能有中文&#xff0c;安装包路径也不要有中文。 试装系统&#xff1a;win10 64bit 1.解压安装包。 2.双击打开镜像文件&#xff08;需要电脑安装有虚拟光驱&#xff0c;没有的可以下载ultrai…

如何学习 COMSOL 多物理场仿真软件?必备教程

COMSOL Multiphysics 给大家提供了一个方便易用的多物理场耦合仿真平台&#xff0c;这是一个支持多种语言的图形化操作界面&#xff0c;其中包括简体中文。软件提供大量的用于电气、机械、流体流动和 化工等应用领域的物理场接口&#xff0c;可以无缝地耦合任意数量的模块来处理…

COMSOL学习

COMSOL建模学习笔记&#xff08;02&#xff09; 电容矩阵 无限元域 几何中心取在&#xff08;0,0,0&#xff09;点&#xff1b;选择对应的几何坐标&#xff1b;对应扫掠/映射网格 网格 对于无限元域&#xff0c;网格必须画成结构化网格&#xff08;默认中为方形&#xff0…

comsol初学经验分享

最近老师让我教下面的师弟学习这个软件&#xff0c;我就想写这个博客留给他们做一些参考&#xff0c;仅仅是个人的一点经验&#xff0c;本博客没有以任何具体案例为引导&#xff0c;主要讲述了一些学习的方法及途径&#xff0c;同时还有一些自己的推荐及相关链接&#xff0c;希…

comsol学习中心:几何建模

创建二维几何 我们打算创建这样的二维模型 这里演示创建&#xff0c;因此不考虑物理场等的设置 创建空白模型 创建的是二维几何&#xff0c;所以在组件中选择天剑二维组件。 也可以通过在功能树上右键进行此操作 接着在几何选项卡下找到体素开始构建几何 先添加一个圆形&…

COMSOL初级学习之一

COMSOL Multiphysics[1]&#xff08;下称COMSOL&#xff09;&#xff0c;以有限元法为基础&#xff0c;通过求解偏微分方程&#xff08;单场&#xff09;或偏微分方程组&#xff08;多场&#xff09;来实现真实物理现象的仿真。COMSOL最先是MATLAB的一个工具箱FEMLAB&#xff0…

如何快速入门Comsol?

Comsol作为一款性能十分强大的多物理场耦合建模建模软件&#xff0c;如今被越来越多的老师和学生所青睐。 今天我就结合我自己学习Comsol的经历&#xff0c;给大家简单介绍一下&#xff0c;Comsol软件如何快速入门。 写在最前 需要所有初学者注意的是&#xff0c;Comsol只是…

Comsol 6.0 安装

目录 1.下载安装包 2. 安装 3. 结束安装 Enjoy&#xff01; 1.下载安装包 链接&#xff1a;https://pan.baidu.com/s/1tqnnksmogxF1VWqZtRMKcw 提取码&#xff1a;j3b8 --来自百度网盘超级会员V5的分享 2. 安装 将安装包&#xff0c;解压缩 打开【CMSL_CN_x64】 在【CO…