在大学数学课程《线性代数》中,就有矩阵和行列式的出现,这篇文章主要讲矩阵在c++中的实现和一些用途(目前我知道的)
此篇文章只写c++的内容,不具体写到数学中矩阵的一些公式、性质。
本篇文章中一部分图片来自百度百科。
注:在编程中,习惯(不知道是不是只有我的习惯)写成n行m列矩阵,但在数学课本中,是m行n列的矩阵,不要搞混了
由 n×m 个数aij排成的n行m列的数表称为n行m列的矩阵,简称n×m矩阵。记作:
第一次用公式不会用
#include
#define maxn 100
using namespace std;
struct Matrix{
int n,m;//n行m列矩阵
long long a[maxn][maxn];
Matrix(){
memset(a,0,sizeof a);
}
Matrix(int _n, int _m) {
n=_n;
m=_m;
memset(a,0,sizeof a);
}
void scan(){
cin>>n>>m;
for(int i=0;i>a[i][j];
}
}
}
void print(){
for(int i=0;i
非常简单
只有m和n都相同的矩阵才可以相加。
设C=A+B,则:
Cij=Aij+Bij
矩阵加法满足交换律和结合律:
A+B=B+A
A+(B+C)=(A+B)+C
代码:
Matrix pl(Matrix a,Matrix b){
for(int i=0;i
因为a会和矩阵里面的a长得很像,我就改了
就是将一个矩阵乘以一个数字
Matrix mul_num(Matrix a,int b){
for(int i=0;i
满足以下定律:
结合律:a(bA)=(ab)A
交换律:aA=Aa
分配律:(a+b)A=aA+bA
(A+B)a=aA+aB
好了,新手期度过
当A*B时,必须满足A的n(列数)和B的m(行数)相同。当A为p*n矩阵,B为n*q矩阵时,C为p*q矩阵。
他的元素:
Matrix mul(Matrix a,Matrix b){
Matrix res(a.n,b.m);
for(int i=0;i
矩阵乘法满足的运算定律:
结合律:A(BC)=(AB)C
左分配律:C(A+B)=CA+CB
右分配律:(A+B)C=AC+BC
我们都知道,1*a=a,那么如果我们要在矩阵中找到一个和1的性质一样的矩阵,要怎么做呢???
单位矩阵出场!
单位矩阵:一个n*n的矩阵,左下角到右下角都是1,其他都是0。
当n*m的矩阵乘以一个n*n的单位矩阵时,不会发生改变。
具体过程如下:
单位矩阵在快速幂中有用
只有n*n矩阵才可以快速幂。
如何快速幂???
矩阵的快速幂和普通的不同,我们可以这样想:
A^7=A*A*A*A*A*A*A=(A*A)*(A*A)*A*A*A
说起来有些奇妙,但实际上就是个这样的过程:
Matrix mpow(Matrix a,int n){
Matrix res(a.n,a.n);
for(int i=0;i>=1;
}
return res;
}
你可能看不懂,但如果我把他变成数字的快速幂,你就懂了。
int mpow(int a,int n){
int res=1;//初始化
while(n!=0){
if(n&1)res=a*res;//统计多出来的a
a=a*a;
n>>=1;//就是除2
}
return res;
}
我们刚开始构建一个单位矩阵res,用他充当1的作用。
#include
#define maxn 100
using namespace std;
int mm;
struct Matrix{
int n,m;
long long ma[maxn][maxn];
Matrix(){
memset(ma,0,sizeof ma);
}
Matrix(int _n, int _m) {
n=_n;
m=_m;
memset(ma,0,sizeof ma);
}
void scan(){
cin>>n>>m;
for(int i=0;i>ma[i][j];
}
}
}
void print(){
for(int i=0;i>=1;
}
return res;
}
int main(){
return 0;
}
既然我们说了这么多,你可能会很疑惑:为什么我们要用到矩阵呢?编程中哪里需要用到矩阵呢?
我学矩阵时也这样,好像矩阵离我很远的样子。
那么我们来看几道例题:
这道题用矩阵解很简单,有两种相似的做法。
我们都知道,斐波那契数列的式子是:
那我们考虑行矩阵
那我们就要考虑base是什么
分解:
这不就巧了吗,刚好就出现了n-1项和n-2项,那么base就是这个1110了
根据左分配律,可以得出,我们不断递推,就相当于
多思考一下就可以得出了
那么,最后只要输出就行了
代码如下
#include
#define maxn 100
using namespace std;
int mm;
struct Matrix{
int n,m;
long long ma[maxn][maxn];
Matrix(){
memset(ma,0,sizeof ma);
}
Matrix(int _n, int _m) {
n=_n;
m=_m;
memset(ma,0,sizeof ma);
}
void scan(){
cin>>n>>m;
for(int i=0;i>ma[i][j];
}
}
}
void print(){
for(int i=0;i>=1;
}
return res;
}
int main(){
return 0;
}
我们换成竖的:
理论差不多,不多说了。不然又浪费我的手和时间
应该都会了吧,自己推吧,直接上代码(因为是上课写的,格式有些不一样)
#include
using namespace std;
const int maxn = 100 + 10;
int mod;
typedef long long ll;
struct Matrix {
int n, m;
long long a[maxn][maxn];
Matrix() { memset(a, 0, sizeof a); }
Matrix(int _n, int _m) {
n = _n;
m = _m;
memset(a, 0, sizeof a);
}
};
Matrix mul(Matrix &a, Matrix &b) {
Matrix res(a.n, b.m);
for(int i=0;i>=1;
}
return res;
}
int main() {
freopen("Fibonacci.in", "r", stdin);
freopen("Fibonacci.out", "w", stdout);
ll n;
scanf("%lld%d", &n, &mod);
if (n == 1 || n == 2) return 0 * puts("1");
Matrix F(1,2);
F.a[0][0]=1;
Matrix A(2,2);
A.a[0][0]=1;
A.a[0][1]=1;
A.a[1][0]=1;
A.a[1][1]=0;
A=Pow(A,n-1);
F=mul(F,A);
cout<