首页 > 其他分享 >矩阵

矩阵

时间:2023-11-19 09:11:50浏览次数:32  
标签:Mat temp int 矩阵 加减 就是

矩阵
顾名思义就是一个小破方阵
类似这样
0 0 1 1
0 1 0 1
0 1 1 1
0 0 0 0
这就是一个四行四列的矩阵,
矩阵包含三个信息, 长度, 宽度, 数值
数值就是矩阵里每一位上的数值, 通常用一个数值来存

为了方便使用我们常写成结构体形式

定义
struct Mat
{
	int l, r;  // 长, 宽
	int a[N][N]; // 矩阵数组
};

那么矩阵有什么作用呢?
在定义中, 矩阵满足加, 减, 乘三种运算

矩阵加减

两个矩阵A, B可以加减的前提是他们的长宽对应相等
如下
A
1 2 3
4 5 6
7 8 9
3 4 2

B
5 3 3
4 5 8
9 9 9
7 7 7
这两个矩阵长宽相等于是可以加减
而矩阵加减非常简单, 就是对应位置加减, 就和普通运算一样, 具有交换律和结合律

如B - A
4 1 0
0 0 2
2 1 0
4 3 5
可得到如上矩阵
这就是矩阵加减, 因为很简单, 所以基本不考

代码
核心代码
struct Mat
{
    int l, r;
    int a[N][N];
}A, B, C;

Mat Mat_add(Mat &A, Mat &B) // 矩阵减同理
{
    Mat temp;
    temp = {A.l, A.r};
    for (int i = 1; i <= A.l; i ++ )
        for (int j = 1; j <= A.r; j ++ )
            temp.a[i][j] = A.a[i][j] + B.a[i][j];
    return temp;
}
具体代码
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 100;

int n, m;

struct Mat
{
    int l, r;
    int a[N][N];
}A, B, C;

Mat Mat_add(Mat &A, Mat &B)
{
    Mat temp;
    temp = {A.l, A.r};
    for (int i = 1; i <= A.l; i ++ )
        for (int j = 1; j <= A.r; j ++ )
            temp.a[i][j] = A.a[i][j] + B.a[i][j];
    return temp;
}

void print(Mat &A)
{
    for (int i = 1; i <= A.l; i ++ )
    {
        for (int j = 1; j <= A.r; j ++ )
            printf("%-2d ", A.a[i][j]);
        puts("");
    }
    puts("");
}

int main()
{
    
    cin >> n >> m;
    A = {n, m};
    B = {n, m};
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            cin >> A.a[i][j];
            
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )  
            cin >> B.a[i][j];
            
    C = Mat_add(A, B);
    
    print(C);
    return 0;
}

矩阵乘法

相对于矩阵加减, 矩阵乘法就要重要很多
它的前提是两个矩阵A * B, A的宽度要等于, B的长度 (长度为上面定义中的l,宽度为r)

怎么乘呢?
设A
1 2 3
4 5 6

B
3 1
4 2
5 8

用A第i行的第k个数去乘, B第j列的第k个数, 得到的这k个结果相加就是新矩阵C的第i行第j列的数值

设i = 1, j = 2
那么就是
1 2 3 * 1
2
8
ans = 1 * 1 + 2 * 2 +3 * 8
那么C.a[i][j] = 1 * 1 + 2 * 2 +3 * 8 = 29

总结一下就是, A矩阵的第i行和B矩阵的第j列对应项相乘之就是, 结果矩阵C的第i行第j列的结果
同时结果矩阵C的长度为A的长度, 宽度为B的宽度

那么A * B的结果矩阵C就是
26 29
48 62

刚开始学矩阵会很陌生, 但是不要紧, 多算算就熟练了

性质

因为其这个i行j列相乘的性质, 所以矩阵乘法是没有交换律
你现在可以试试求求B * A 看看是否满足 B * A == A * B

虽然没有交换律, 但是它具有结合律, 也就是(A * B) * C == A * (B * C)
自己也可以试试, 这里不证明了

代码

看看代码吧

Mat Mat_mul(Mat &A, Mat &B, int p) // A * B 每一项取模 p, 返回结果矩阵
{
	Mat temp = {A.l, B.r}; // 我们一般开一个矩阵存结果, 并在最后返回它
	// 下面就是正常的计算, 请自行理解, 这里没法言传
	for (int i = 1; i <= A.l; i ++ ) 
		for (int j = 1; j <= B.r; j ++ )
			for (int k = 1; k <= A.r; k ++ ) // A.r == B.l
				temp.a[i][j] = (temp.a[i][j] + 1ll * A.a[i][k] * B.a[k][j]) % p;
				// 记得防爆int
	return temp;
}

这就是最基本的矩阵了

对于矩阵更重要的作用是[[矩阵快速幂]]

标签:Mat,temp,int,矩阵,加减,就是
From: https://www.cnblogs.com/blind5883/p/17841592.html

相关文章

  • 2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那
    2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像,那么称这个正方形矩阵叫做神奇矩阵。比如:1551633663361551这个正方形矩阵就是神奇矩阵。给定一个大矩阵n*m,返回其中神奇矩阵的数目。1<=n,m<=1000。来自左程云。答案2023-11-18:go,c......
  • 2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那
    2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像,那么称这个正方形矩阵叫做神奇矩阵。比如:1551633663361551这个正方形矩阵就是神奇矩阵。给定一个大矩阵n*m,返回其中神奇矩阵的数目。1<=n,m<=1000。来自左程云。答案2......
  • es笔记七之聚合操作之桶聚合和矩阵聚合
    本文首发于公众号:Hunter后端原文链接:es笔记七之聚合操作之桶聚合和矩阵聚合桶(bucket)聚合并不像指标(metric)聚合一样在字段上计算,而是会创建数据的桶,我们可以理解为分组,根据某个字段进行分组,将符合条件的数据分到同一个组里。桶聚合可以有子聚合,意思就是在分组之后,可以在每......
  • 矩阵乘法
    一个神奇的东西矩阵乘法重载符实现代码:nodeoperator*(constnode&a)const{nodesum(0);for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)for(intk=1;k<=n;k++)sum.g[i][j]+=g[i][k]*a.g[k][j];r......
  • 【动态规划】矩阵连乘问题
    问题描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。m[i][j] :i=j时指矩阵Ai ,i<j时指矩阵Ai到矩阵Aj的若干矩阵连乘的最小次数。pi指维数。例: ......
  • 算法学习笔记(37): 矩阵
    一切线性操作都可以归为矩阵乘法--bySmallBasic本文是拿来玩耍,而不是学习的!目录线性递推超级矩阵快速幂!矩阵与邻接矩阵矩阵与线段树矩阵与FFT矩阵与期望不知道还能扯啥了矩阵的加法,要求两个矩阵大小相等,于是可以对位单点相加。\[C_{i,j}=A_{i,j}+B_{i,j}\]关于矩......
  • 考研数学笔记:线性代数中抽象矩阵性质汇总
    在考研线性代数这门课中,对抽象矩阵(矩阵\(A\)和矩阵\(B\)这样的矩阵)的考察几乎贯穿始终,涉及了很多性质、运算规律等内容,在这篇考研数学笔记中,我们汇总了几乎所有考研数学要用到的抽象矩阵的性质,详情在这里:线性代数抽象矩阵(块矩阵)运算规则(性质)汇总......
  • 无监督学习的集成方法:相似性矩阵的聚类
    在机器学习中,术语Ensemble指的是并行组合多个模型,这个想法是利用群体的智慧,在给出的最终答案上形成更好的共识。这种类型的方法已经在监督学习领域得到了广泛的研究和应用,特别是在分类问题上,像RandomForest这样非常成功的算法。通常应用一些投票/加权系统,将每个单独模型的输出组......
  • P1129 [ZJOI2007] 矩阵游戏
    挺喜欢的一题。首先我们很容易观察到一个性质:每一行和每一列上的黑色方格的数量是不变的,只能改变它在那一行和那一列的排列顺序。由此若是有某一行或某一列上没有黑色方格,直接输出No即可。此时我们考虑的情况就是每一行和每一列上至少都会有一个黑色方格。这时有一个结论:若有......
  • 线性代数 · 矩阵 · Matlab | Moore-Penrose 伪逆矩阵代码实现
    背景-Moore-Penrose伪逆矩阵:对任意矩阵\(A\in\mathbbC^{m\timesn}\),其Moore-Penrose逆矩阵\(A^+\in\mathbbC^{n\timesm}\)存在且唯一。定义:若矩阵G满足\(AGA=A,~GAG=G,~(AG)^H=AG,~(GA)^H=GA\),则G是Moore-Penrose逆矩阵,可以记作\(A^+\)。性质:\(A^......