矩阵算法的介绍和实现

一. 介绍

首先我们要清楚矩阵是什么:矩阵是一个按照长方阵列排列的复数或实数集合

1> 定义

  1. 定义:m×n矩阵为m×n个数排成的m行n列 的表格,当m=n时,矩阵A称为n阶方阵 或者n阶矩阵
  2. 零矩阵:矩阵所有元素都为0。
  3. 同型矩阵:A矩阵为m×n矩阵,B矩阵为s×t矩阵,如果m=s,n=t,A和B即为同型矩阵。
  4. A和B相等:两个同型矩阵对应的元素都相等
  5. |A|(detA):n阶方阵A构成的行列式。

以上就为3*4的一个矩阵

2> 运算

  1. 加法:两个同型矩阵可以相加
  2. 数乘:k为数,数乘时是将k与矩阵中每一个元素进行乘积
  3. 乘法:设A是一个m×s矩阵,B是一个s×t矩阵(A的列数=B的行数),则A、B可乘,且乘积AB是一个m×t矩阵,记为C。其中C的第i行、第j列元素Cij是A的第i行s个元素和B的第j列s个对应元素两两乘积之和。(每个新元素等于原来两个矩阵对应行元素逐个乘上对应列元素,再加和
  4. 转置:将m×n型矩阵A=[aij]m×n的行列互换的到的n×m矩阵[aji]n×m,称为A的转置矩阵。
  5. 矩阵多项式:设A是n阶矩阵,f(x)=amxm+......+a1x+a0是x的多项式,则称 amAm+am-1Am-1+......+a1A+a0E为矩阵多项式,记为f(A)

3> 性质

Ⅰ.加法

  1. A+B=B+A
  2. (A+B)+C=A+(B+C)
  3. A+O=A (其中O是元素全为0的同型矩阵)
  4. A+(-A)=O

Ⅱ.数乘

  1. k(mA)=(km)A=m(kA)
  2. (k+m)A=kA+mA
  3. k(A+B)=kA+kB
  4. 1A=A
  5. 0A=O

Ⅲ.乘法

  1. (AB)C=A(BC)
  2. A(B+C)=AB+AC
  3. (B+C)A=BA+CA(注意顺序不可以颠倒

Ⅳ.转置

  1. (A+B)T=AT+BT
  2. (kA)T=kAT
  3. (AB)T=BTAT
  4. (AT)T=A

注意

  1. AB≠BA
  2. A≠O,B≠O,但有可能AB=O
  3. AB=AC,A≠O不能推出B=C
  4. (A+B)(A+B)=A2+AB+BA+B2
  5. (A+E)2=A2+2A+E
  6. (A+E)(A-E)=A2-E2
  7. AB=O 可推出B的列向量是AX=0的解

二. 算法

矩阵类题目常常把思考的维度从一维扩展到二维,需要考虑的边界条件也相应增多,以矩阵为背景的题目大多有动态规划类型、记忆搜索类型、深度优先搜索类型等等。

实例一:

题目描述:有x*y大小的格子,只能从左往右、从上往下走,问从左上到右下有多少种走法

示例

一个2*3的矩阵,

1 2 3

4 5 6

从1出发走到6,则可能的走法为:1 2 3 6, 1 2 5 6, 1 4 5 6共有三种。

解决思路:从最后一个格子进行倒推,需要找到关系方程:res[i][j] = res[i-1][j] + res[i][j-1],然后可以用递归或者非递归的方法进行求解。

递归:
java 复制代码
public static int numPath(int x, int y) {
    if(x==1||y==1) return 1;
    return numPath2(x-1, y) + numPath2(x, y-1);
  }
非递归:
java 复制代码
public static int numPath(int x, int y) {
    if(x == 1 || y == 1){
       return 1;
    }
    int[][] res = new int[x][y];
    for(int i = 0; i < x; i++){
       res[i][0] = 1;
    }
    for(int i = 0; i < y; i++){
       res[0][i] = 1;
    }
    for(int i = 1; i < x; i++) {
      for(int j = 1; j < y; j++) {
        res[i][j] = res[i-1][j] + res[i][j-1];
      }
    }
    return res[x-1][y-1];
  }

示例二:

给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**

使用两个标记变量

思路和算法

在代码中,我们用两个标记数组分别记录每一行和每一列是否有零出现, 我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean flagCol0 = false, flagRow0 = false;
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flagRow0 = true;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if (flagCol0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
        if (flagRow0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}

题出处:73. 矩阵置零 - 力扣(LeetCode)

❤️❤️❤️

相关推荐
Microsoft Word4 分钟前
c++基础语法
开发语言·c++·算法
天才在此17 分钟前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
Guofu_Liao2 小时前
大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法
人工智能·语言模型·矩阵·llama
茶猫_2 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
肥猪猪爸4 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn4 小时前
二分基本实现
数据结构·算法
萝卜兽编程4 小时前
优先级队列
c++·算法
盼海5 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步5 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表