计算机视觉基础:矩阵运算

矩阵及其表示方式

一个矩阵是由行(row)和列(column)组成的一个矩形数组,通常包含数字。我们可以用大写字母(如 A、B)来表示一个矩阵。例如,矩阵 A 可能看起来像这样:

A = [ a11 a12 a13 ]
    [ a21 a22 a23 ]
    [ a31 a32 a33 ]

其中,a11是位于第一行第一列的元素,a12是第一行第二列的元素,以此类推。图像可以被看作是一个巨大的矩阵,其中每个像素点对应矩阵中的一个元素。

矩阵基础运算

  • 矩阵加法和减法:矩阵的加减法是对应位置元素相加或相减。例如,如果有两个相同大小的矩阵 A 和 B,它们的加法 A+B 将产生一个新矩阵 C,其中 cij = aij + bij。
  • 矩阵数乘:矩阵 A 与一个标量 k 的数乘是将 A 中的每个元素乘以 k。

矩阵乘法

矩阵乘法是线性代数中的一个核心操作,它在图像处理、计算机图形学以及数据科学的许多方面都非常重要。现在,我将更详细地解释矩阵乘法以及如何计算两个矩阵的产品。

矩阵乘法详解

当你乘以两个矩阵时,你其实是在将第一个矩阵的行与第二个矩阵的列组合。对于两个矩阵 A 和 B,矩阵 A 的列数必须等于矩阵 B 的行数才能进行乘法。

我们来逐步分析一下具体的操作步骤:

  1. 确认矩阵 A 的列数等于矩阵 B 的行数。
  2. 创建结果矩阵 C,其维度将是矩阵 A 的行数乘以矩阵 B 的列数(如果 A 是 m×n 维,B 是 n×p 维,那么 C 是 m×p 维)。
  3. 计算矩阵 C 的每个元素 cij。为了找到 cij,你需要取矩阵 A 的第 i 行和矩阵 B 的第 j 列。
  4. 将 A 的第 i 行与 B 的第 j 列上的对应元素进行相乘,并将乘积相加。这个总和就是矩阵 C 的元素 cij。

简单举例解释

使用一个 2×3 的矩阵 A 和一个 3×2 的矩阵 B。

A = [ a11 a12 a13 ]     B = [ b11 b12 ]
    [ a21 a22 a23 ]         [ b21 b22 ]
                            [ b31 b32 ]

令矩阵 A 和 B 为:

A = [ 1 2 3 ]    B = [ 7 8 ]
    [ 4 5 6 ]        [ 9 0 ]
                     [ 1 2 ]

根据矩阵乘法的规则,我们可以计算矩阵 A 和 B 的乘积 C,结果矩阵 C 的大小将是 2×2。我们现在按步骤计算,并将乘积算式放到结果矩阵 C 中:

C = [ (a11*b11 + a12*b21 + a13*b31) (a11*b12 + a12*b22 + a13*b32) ]
    [ (a21*b11 + a22*b21 + a23*b31) (a21*b12 + a22*b22 + a23*b32) ]

代入我们给定的矩阵:

C = [ (1*7 + 2*9 + 3*1) (1*8 + 2*0 + 3*2) ]
    [ (4*7 + 5*9 + 6*1) (4*8 + 5*0 + 6*2) ]

计算得到结果矩阵 C 的每个元素:

C = [ (7 + 18 + 3) (8 + 0 + 6) ]
    [ (28 + 45 + 6) (32 + 0 + 12) ]

将每个元素中的数值相加:

C = [ 28 14 ]
    [ 79 44 ]

所以,矩阵 A 和 B 的乘积 C 是:

C = [ 28 14 ]
    [ 79 44 ]

这就是矩阵乘法的结果。

稍复杂举例解释

我们让矩阵 A 是一个 2×3 的矩阵,矩阵 B 是一个 3×4 的矩阵。下面是 A 和 B 的示例:

A = [ a11 a12 a13 ]     B = [ b11 b12 b13 b14 ]
    [ a21 a22 a23 ]         [ b21 b22 b23 b24 ]
                            [ b31 b32 b33 b34 ]

由于矩阵 A 的大小是 2×3,矩阵 B 的大小是 3×4,矩阵 A 的列数和矩阵 B 的行数相同,我们可以计算出它们的乘积 C。结果矩阵 C 的大小将是 2×4。

让我们具体计算矩阵 A 和 B 的乘积,并将乘积算式直接写在结果矩阵 C 中。

C = [ (a11*b11 + a12*b21 + a13*b31) (a11*b12 + a12*b22 + a13*b32) (a11*b13 + a12*b23 + a13*b33) (a11*b14 + a12*b24 + a13*b34) ]
    [ (a21*b11 + a22*b21 + a23*b31) (a21*b12 + a22*b22 + a23*b32) (a21*b13 + a22*b23 + a23*b33) (a21*b14 + a22*b24 + a23*b34) ]

现在,我们来设定具体的数字来完成乘法:

A = [ 1 2 3 ]     B = [ 2 0 1 4 ]
    [ 4 5 6 ]         [ 0 1 3 2 ]
                      [ 7 8 5 6 ]

计算出结果矩阵 C 的每个元素:

C = [ (1*2 + 2*0 + 3*7) (1*0 + 2*1 + 3*8) (1*1 + 2*3 + 3*5) (1*4 + 2*2 + 3*6) ]
    [ (4*2 + 5*0 + 6*7) (4*0 + 5*1 + 6*8) (4*1 + 5*3 + 6*5) (4*4 + 5*2 + 6*6) ]

进行计算,我们得到:

C = [ (2 + 0 + 21) (0 + 2 + 24) (1 + 6 + 15) (4 + 4 + 18) ]
    [ (8 + 0 + 42) (0 + 5 + 48) (4 + 15 + 30) (16 + 10 + 36) ]

将 C 中的每个元素简化:

C = [ 23 26 22 26 ]
    [ 50 53 49 62 ]

所以,经过计算,我们得到的最终结果矩阵 C 是:

C = [ 23 26 22 26 ]
    [ 50 53 49 62 ]

这个结果就是我们从矩阵 A 和 B 计算得到的乘积。

练习

假设我们有两个矩阵 A 和 B:

A = [1 2]    B = [5 6]
    [3 4]        [7 8]

矩阵 A 是一个 2×2 的矩阵,矩阵 B 也是一个 2×2 的矩阵。它们的乘积 AB 将产生另一个 2×2 的矩阵 C。那么 C 就是:

C = [ c11 c12 ]
    [ c21 c22 ]

我们现在来计算 C 的每一个元素。

  • 计算 c11:
    我们取 A 的第一行 [1 2] 和 B 的第一列 [5 7],
    之后将对应元素相乘并相加:1×5 + 2×7 = 5 + 14 = 19。
  • 计算 c12:
    我们取 A 的第一行 [1 2] 和 B 的第二列 [6 8],
    之后将对应元素相乘并相加:1×6 + 2×8 = 6 + 16 = 22。
  • 计算 c21:
    我们取 A 的第二行 [3 4] 和 B 的第一列 [5 7],
    之后将对应元素相乘并相加:3×5 + 4×7 = 15 + 28 = 43。
  • 计算 c22:
    我们取 A 的第二行 [3 4] 和 B 的第二列 [6 8],
    之后将对应元素相乘并相加:3×6 + 4×8 = 18 + 32 = 50。

所以,矩阵 C 就是:

C = [19 22]
    [43 50]

这就完成了矩阵 A 和 B 的乘积。

矩阵乘法不符合交换律,也就是说,通常 AB ≠ BA。这是计算矩阵乘积时要特别注意的一点。

理解好矩阵乘法之后,在处理图像时,你会经常用到它来进行变换、过滤和其他操作。希望这个例子能够帮助你理解矩阵乘法的具体过程。

单位矩阵和逆矩阵

  • 单位矩阵:是一个特殊的方阵,其所有对角线上的元素都是 1,其余元素都是 0,记为 I。例如:

    I = [ 1 0 0 ]
    [ 0 1 0 ]
    [ 0 0 1 ]

  • 逆矩阵:对于一个方阵 A,如果存在另一个方阵 B,使得 AB = BA = I,则我们说 B 是 A 的逆矩阵,记作 A^(-1)。不是所有矩阵都有逆矩阵,只有那些行列式(determinant)不为 0 的方阵才有逆矩阵。

矩阵的转置

转置操作将矩阵的行和列交换位置。对于矩阵 A,它的转置记为 A^T。A 的一个元素 aij 在 A^T 中的位置变成了 aji。

例如,如果有矩阵 A:

A = [ 1 2 ]
    [ 3 4 ]

那么 A^T 就是:

A^T = [ 1 3 ]
       [ 2 4 ]
相关推荐
luky!11 分钟前
算法--解决熄灯问题
python·算法
鸽鸽程序猿16 分钟前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法
_OLi_18 分钟前
力扣 LeetCode 150. 逆波兰表达式求值(Day5:栈与队列)
算法·leetcode·职场和发展
IT古董25 分钟前
【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)
人工智能·python·线性代数·机器学习
远望清一色28 分钟前
基于MATLAB身份证号码识别
开发语言·图像处理·算法·matlab
生信与遗传解读29 分钟前
基于python的线性代数相关计算
python·线性代数·机器学习
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
lapiii3582 小时前
图论-代码随想录刷题记录[JAVA]
java·数据结构·算法·图论
取个名字真难呐2 小时前
矩阵乘法实现获取第i行,第j列值,矩阵大小不变
python·线性代数·矩阵·numpy
Dontla3 小时前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust