首页 > 其他分享 >矩阵

矩阵

时间:2024-04-28 19:44:06浏览次数:22  
标签: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/18164383

相关文章

  • 力扣-566. 重塑矩阵
    1.题目题目地址(566.重塑矩阵-力扣(LeetCode))https://leetcode.cn/problems/reshape-the-matrix/题目描述在MATLAB中,有一个非常有用的函数reshape,它可以将一个 mxn矩阵重塑为另一个大小不同(rxc)的新矩阵,但保留其原始数据。给你一个由二维数组mat表示的 mxn......
  • 矩阵转置 O(1)
    矩阵转置链接为:https://www.acwing.com/problem/content/3595/使用了辅助空间的:#include<iostream>usingnamespacestd;constintN=110;inta[N][N];intb[N][N];intmain(){intn;cin>>n;for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)......
  • 力扣-59. 螺旋矩阵 II
    1.题目题目地址(59.螺旋矩阵II-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix-ii/题目描述给你一个正整数 n,生成一个包含1到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn正方形矩阵matrix。 示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]......
  • Games 101: 旋转矩阵
    旋转矩阵本文主要介绍了旋转矩阵的推导,分为两种方式:旋转坐标旋转坐标轴以下坐标系都是右手坐标系旋转坐标已知坐标点\(A(x_a,y_a)\),旋转\(\theta\)角后变为坐标点\(B(x_b,y_b)\),求解旋转矩阵.\[{\large\begin{align*}\begin{split}x_a&=r_a\cdotcos(\alpha)=......
  • 力扣-54. 螺旋矩阵
    1.题目题目地址(54.螺旋矩阵-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix/题目描述给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:......
  • 矩阵快速幂
    1.参考参考:【矩阵快速幂】简单题学「矩阵快速幂」2.定义2.1定义如果直接求取M^n,时间复杂度是O(n),可以定义矩阵乘法,然后用快速幂算法来加速这里M^n的求取,简化时间复杂度为O(logn)主体思路就是不求M^n而是求M^(n/2),然后先不求M^(n/2),先求M^(n/4)具体实现同......
  • 【刚度矩阵推导】2d frame 单元
    2dframe单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为:\(u=[u_1,u_2,u_3,u_4,u_5,u_6]^{T}\)其局部坐标系下的刚度矩阵可以由2dtruss单元和2dbornoulli-beam单元的刚度矩阵组合而成.使用matlab进行推导:%!b......
  • 【知识点】快速幂与矩阵快速幂
    什么是快速幂,为什么要使用快速幂?Macw:快速幂有好多好处。Penelope:例如?Macw:它比较快。见名知意,快速幂算法可以在非常短的时间内求出一个数的\(n\)次幂。虽然快速幂在初学阶段的应用不算太多,但是快速幂背后的思想是非常值得我们去理解的。举例而言,如果我们要求出\(3^......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......
  • 矩阵树定理 BEST 定理
    矩阵树定理\(\text{BEST}\)定理证明很复杂,连\(\text{cmd}\)这种无敌神犇都不会,而且对定理本身的可扩展性几乎为\(0\),即每次套用的定理都跟模板一模一样。矩阵树无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环无论任何情况,一定要不能有自环对于无向无权图,......