G
N
I
D
A
O
L

【数据结构-矩阵】矩阵的相关公式推导

1 数组

设数组元素长度为 L。

1.1 一维数组

数组下标从 0 开始(A[0]--A[n],一共 n+1 个),假设当前下标为A[i]

  • 第几个 = i + 1
  • 存储地址 = 首地址 + (第几个-1) * L = A[0] 地址 + i * L

数组下标从 1 开始(A[1]--A[n],一共 n 个),假设当前下标为A[i]

  • 第几个 = i
  • 存储地址 = 首地址 + (第几个-1) * L = A[1] 地址 + (i - 1) * L

1.2 二维数组

数组下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 第几个 = i * (a+1) + j + 1
  • 存储地址 = 首地址 + (第几个-1) * L = A[0, 0] 地址 + (i * (a+1) + j) * L

数组下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 第几个 = j * (b+1) + i + 1
  • 存储地址 = 首地址 + (第几个-1) * L = A[0, 0] 地址 + (j * (b+1) + i) * L

数组下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 第几个 = (i-1) * a + j
  • 存储地址 = 首地址 + (第几个-1) * L = A[1, 1] 地址 + ((i-1) * a + j - 1) * L

数组下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 第几个 = (j-1) * b + i
  • 存储地址 = 首地址 + (第几个-1) * L = A[1, 1] 地址 + ((j-1) * b + i - 1) * L

2 对称矩阵

设矩阵 Aaxb,一般情况下,矩阵为方阵,即 a = b = n。设数组元素长度为 L,一般推导思路是从“求矩阵元素是数组的第几个元素”入手,进而推出数组元素的下标。

2.1 上三角部分(i ≤ j)

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = a + (a-1) + (a-2) +...+ (a-i+2) + (j-i+1) = (i-1)(2a-i+2)/2 + (j-i+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + ((i-1)(2a-i+2)/2 + (j-i)) * L

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ j + (i+1) = j(j+1)/2 + (i+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(j+1)/2 + i) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = a + (a-1) + (a-2) +...+ (a-i+1) + (j-i+1) = i(2a-i+1)/2 + (j-i+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(2a-i+1)/2 + (j-i)) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ (j-1) + i = j(j-1)/2 + i
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(j-1)/2 + i - 1) * L

2.2 下三角部分(i ≥ j)

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ i + (j+1) = i(i+1)/2 + (j+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(i+1)/2 + j) * L

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = b + (b-1) + (b-2) +...+ (b-j+2) + (i-j+1) = (j-1)(2b-j+2)/2 + (i-j+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + ((j-1)(2b-j+2)/2 + (i-j)) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ (i-1) + j = i(i-1)/2 + j
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(i-1)/2 + j - 1) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = b + (b-1) + (b-2) +...+ (b-j+1) + (i-j+1) = j(2b-j+1)/2 + (i-j+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(2b-j+1)/2 + (i-j)) * L

3 三角矩阵

设矩阵 Aaxb,一般情况下,矩阵为方阵,即 a = b = n。设数组元素长度为 L。推导过程与对称矩阵相同。

3.1 上三角矩阵(i ≤ j 的元素不全为 0)

(1)当 i ≤ j 时(不全为 0):

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = a + (a-1) + (a-2) +...+ (a-i+2) + (j-i+1) = (i-1)(2a-i+2)/2 + (j-i+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + ((i-1)(2a-i+2)/2 + (j-i)) * L

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ j + i + 1 = j(j+1)/2 + i + 1
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(j+1)/2 + i) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = a + (a-1) + (a-2) +...+ (a-i+1) + (j-i+1) = i(2a-i+1)/2 + (j-i+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(2a-i+1)/2 + (j-i)) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ (j-1) + i = j(j-1)/2 + i
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(j-1)/2 + i - 1) * L

(2)当 i > j 时(全为 0):

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),假设当前下标为A[i, j]

  • 数组的第几个元素 = n(n+1)/2 + 1

矩阵下标从 1 开始(A[0, 0]--A[a, b],每行 a 个,每列 b 个),假设当前下标为A[i, j]

  • 数组的第几个元素 = n(n-1)/2 + 1

3.2 下三角矩阵(i ≥ j 的元素不全为 0)

(1)当 i ≥ j 时(不全为 0):

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ i + j = i(i+1)/2 + j + 1
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(i+1)/2 + j) * L

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = b + (b-1) + (b-2) +...+ (b-j+2) + (i-j+1) = (j-1)(2b-j+2)/2 + (i-j+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + ((j-1)(2b-j+2)/2 + (i-j)) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = 1 + 2 + 3 +...+ (i-1) + j = i(i-1)/2 + j
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (i(i-1)/2 + j - 1) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 数组的第几个元素 = b + (b-1) + (b-2) +...+ (b-j+1) + (i-j+1) = j(2b-j+1)/2 + (i-j+1)
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (j(2b-j+1)/2 + (i-j)) * L

(2)当 i < j 时(全为 0):

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),假设当前下标为A[i, j]

  • 数组的第几个元素 = n(n+1)/2 + 1

矩阵下标从 1 开始(A[0, 0]--A[a, b],每行 a 个,每列 b 个),假设当前下标为A[i, j]

  • 数组的第几个元素 = n(n-1)/2 + 1

4 三对角矩阵

设矩阵 Aaxb,一般情况下,矩阵为方阵,即 a = b = n。设数组元素长度为 L。

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),行优先,假设当前下标为A[i, j]

  • 第 1 ~ i 行有几个元素:3i-1;A[i, j] 是第 i+1 行第 j-i+2 个元素
  • 数组的第几个元素 = (3i-1) + (j-i+2) = 2 * i + j + 1
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (2 * i + j) * L

矩阵下标从 0 开始(A[0, 0]--A[a, b],每行 a+1 个,每列 b+1 个),列优先,假设当前下标为A[i, j]

  • 第 1 ~ j 列有几个元素:3j-1;A[i, j] 是第 j+1 行第 i-j+2 个元素
  • 数组的第几个元素 = (3j-1) + (i-j+2) = 2 * j + i + 1
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (2 * j + i) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),行优先,假设当前下标为A[i, j]

  • 第 1 ~ i-1 行有几个元素:3(i-1)-1;A[i, j] 是第 i 行第 j-i+2 个元素
  • 数组的第几个元素 = 3(i-1)-1 + (j-i+2) = 2 * (i-1) + j
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (2 * (i-1) + j - 1) * L

矩阵下标从 1 开始(A[1, 1]--A[a, b],每行 a 个,每列 b 个),列优先,假设当前下标为A[i, j]

  • 第 1 ~ j-1 列有几个元素:3(j-1)-1;A[i, j] 是第 j 列第 i-j+2 个元素
  • 数组的第几个元素 = 3(j-1)-1 + (i-j+2) = 2 * (j-1) + i
  • 存储地址 = 首地址 + (第几个-1) * L = 数组首地址 + (2 * (j-1) + i - 1) * L

【注】以上公式均不适用于第一行。

5 稀疏矩阵

三元组、十字链表法。

posted @ 2022-10-20 17:40  漫舞八月(Mount256)  阅读(581)  评论(0编辑  收藏  举报