首页 > 其他分享 >【数据结构-矩阵】矩阵的相关公式推导

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

时间:2022-10-20 17:59:31浏览次数:49  
标签:下标 第几个 推导 -- 矩阵 地址 数组 数据结构

目录

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 稀疏矩阵

三元组、十字链表法。

标签:下标,第几个,推导,--,矩阵,地址,数组,数据结构
From: https://www.cnblogs.com/Mount256/p/16810725.html

相关文章

  • 【数据结构(c语言版)】树的概念以及结构
    数据结构之树的概念以及结构1.树的概念树是一种非线性的数据结构,是由n(n>=0)有限节点的组成的一个具有线性关系的集合。叫树的原因是因为它看起来像是一颗倒挂的树,只不过是根......
  • 填空题:矩阵
    下列给定程序中,函数fun的功能是:有N×N矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为0。例如,若N=3,有下列矩阵:1234567......
  • AcCoders 10477:【省选基础数据结构 树链剖分】【GDOI2016】疯狂动物城 题解
    算法:树链剖分,可持久化线段树。题目大意给定\(n\)个结点的一棵树,\(m\)次操作,操作有三种:将\(x\)至\(y\)最短路径上的所有点的权值加上\(delta\)。对于\(x\)至......
  • 矩阵与线性方程组
    高斯消元当我们用线性方程组来理解矩阵时,我们有矩阵的高斯消元。高斯消元本质上是一系列的对矩阵的“变换”或者说“操作”,这种操作总共有三种:1)给某一整行乘上非零常数\(......
  • Sam's Numbers 矩阵快速幂优化dp
    ​​https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers​​设dp[s][i]表示产生的总和是s的时候,结尾符是i的所有合法方案数。那么dp[s][i]可以由dp[......
  • 封装图这一种数据结构
    1、写了模板类,模板函数的定义需要写在.h文件中。2、一个bool类型是1字节,然后都是用指针来声明数组大小,所以memset(exit,false,(sizeofexit)),错误,因为sizeof指针得到的是4......
  • 796. 子矩阵的和
    输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式......
  • 向量点乘、叉乘公式的一种推导方法
    点乘:      叉乘:   ......
  • 做题记录整理数据结构/线段树 P1712 [NOI2016] 区间(2022/10/17)
    P1712[NOI2016]区间由于现在做题比较杂,所以就不标号码了感觉应该算是思维题?刚开始没想到完全用线段树后来看了题解如果想到线段树的话这题剩下的东西就可以很自然的......
  • 深入剖析Redis系列:Redis数据结构与全局命令概述
    前言Redis提供了5种数据结构。理解每种数据结构的特点,对于Redis的 开发运维 非常重要,同时掌握Redis的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事......