esp8266接收到的数据如何存放到数组中_数组和特殊矩阵压缩

d7fadc0b9988e8fc230572f4b2b7b779.png

数组

数组是由相同类型的数据元素构成的有限集合。一维数组看作一个线性表。

8d63472ba9c8a00d4384de9a0b5f6219.png

二维数组:

二维数组也可看作一个线性表

,只不过每一个数据元素
也是一个线性表。

a7131663d08d81008736edbd7dd24a84.png

二维数组也可以看作一个线性表

,只不过每一个数据元素
也是一个线性表。

437df53b6c0a394a0c59c3bf0666baed.png

数组存储:

数组一般采用顺序存储结构,因为存储单元是一维的,而数组可以是多维,如何用一位数组存储多位数组呢?以二维数组为例,可以按行存储,即先存第一行,再存第二行,...,;也可以按列存储,先存第一列,再存第二列,...;c语言和java都是按列存储的。

如果按序存储,怎么找到

的存储位置呢?

先看看存储

之前,前面已经存储了多少元素。

f9fdd191ba4c9ac6d7d2c3920317b41c.png

之前一共有
个元素,如果每个元素占用
个字节,那么共需要
个字节,只需要用基地址加上这些字节就可以得到
的存储地址了。

按行序存储,

的存储地址:

如果按序存储,怎么找到

的存储位置呢?

先看看存储

之前,前面已经存储了多少元素。

f8fe95f8b6615c2b84809a3303bf6261.png

之前一共有
个元素,如果每个元素占用
个字节,那么共需要
个字节,只需要用基地址加上这些字节就可以得到
的存储地址了。

按行序存储,

的存储地址:

特别注意:二维数组的下标如果从1开始,那么情况就不一样了!!!!!!!

先看看,存储

之前,前面已经存储了多少个元素。

adb2f3c8f46880ea3f040ada61602a6a.png

存储地址

行数和列数都少了1,在

之前一共有
个元素,如果每个元素占用
个字节,那么需要
个字节,只需要用基地址加上这些字节就可以得到
的存储地址了。

如果二维数组下标从1开始,按行序存储

的存储地址:

如果二维数组下标从1开始,按列序存储

的存储地址:

也就是说,如果下标是从1开始的,相应的公式需要行减1,列减1。

存储地址计算秘籍:

的存储地址等于第一个元素的存储地址,加上前面元素个数*每个元素占用的字节数,计算公式:


例题。

1.一个二维数组A,假设每个数组元素占3个存储单元,行下标为0~8,列下标为0~9,从首地址elem开始按连续存储,那么

的存储地址是多少?

2.二维数组

,假设每个数组元素占2个存储单元,基地址是2046,若按
连续存储,那么
的存储地址是多少?

解答:

1.行下标列下标可知,数组为

f9fdd191ba4c9ac6d7d2c3920317b41c.png

由于按行存储,可类比为上图:

前面存储的元素个数
可以按如下计算:

故:

2.

可知:
数组为

f8fe95f8b6615c2b84809a3303bf6261.png

由于按列存储,可类比为上图,

前面存储的元素个数
可以按如下计算:

故:


特殊矩阵压缩

什么是压缩存储?

把多个相同的元素分配一个存储空间,元素为0不分配空间。

什么样的矩阵能够压缩?

特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等。

什么叫稀疏矩阵?

矩阵中非零元素的个数较少,一般认为非零元素个数小于5%的矩阵为稀疏矩阵。

对称矩阵:

对称矩阵比较特殊,其数据元素沿着对角线对称。对称矩阵根据对称性,只存储下三角或上三角即可。

6e7bb5109f8bd556364bc9160cefb1f0.png

如果按行序存储下三角,怎么找到

的存储位置呢?

3ddf07622b83177180b93ab05bf7afa8.png

首先,确定

前有
行,并计算前
行一共有多少元素,然后再加上第
行前面的
个元素即可。

step1

第一行:    a11             1个元素 
第二行:    a21 a22         2个元素
第三行:    a31 a32 a33     3个元素
  ...       ............     .......
第i-1行     ...........     i-1个元素

可以发现,前

行的元素个数,是一个等差数列:

step2:

可以得到,前

行共有元素:

step3: 故

前面元素个数:

一维数组存储:

d4399b3b5deb746a497215ce46e65de1.png

上三角的元素

,根据对称性,
,上三角中的下标可以直接读取下三角中的
即可。因此,按行存储序列下三角时,
下标为:

25dd9ca4d63af19ebf5a089a94857e14.png

存储下标计算秘籍:

如果用一维数组

存储(下标从0开始),则
的存储下标k等于
前面的元素个数:

例题:

一个

的对称矩阵
,将其下三角按行存放在一维数组
中,
存放在
中,
存放在
数组的下标是多少?

解:由按行存储,计算

的存储地址:

可以计算出包括

在内的前
行元素个数,再减1即可。

画出

阶矩阵容易的下三角矩阵:
第一行:    a11             1个元素 
第二行:    a21 a22         2个元素
第三行:    a31 a32 a33     3个元素
  ...       ............     .......
第i行     ...........     i个元素

综上可得

下标:

三角矩阵:

三角矩阵比较特殊,分为下三角矩阵和上三角矩阵,下三角矩阵是指矩阵的下三角有数据,而其余的都是常数c或者为0.

be0de362d3b70d0c979b97d8ee02ddbe.png

下三角矩阵按行存储在一维数组

中:先按行存储下三角,然后存储上三角的常数。

af8dd55b6ef45169efa7ee06de0697bc.png

94555696479eb66f7ccbdb1ad19fa480.png

下三角矩阵按行序存储时,

下标为:

ecda6da7c8184ae55fb3e2d3814c65b5.png

上三角矩阵按行序存储时:

103c14e1f1f820084c1953a2a3fc4963.png

下标为:

e4a20a6c50e15f81b0dad04bddb141db.png

例:一个

阶上三角矩阵
,将其按
存储存放在一维数组
中,
存放在
中,
存放在
数组的下标是多少?

解:由于按列存储,可得上三角矩阵:

第一列:    a11             1个元素 
第二列:    a21 a22         2个元素
第三列:    a31 a32 a33     3个元素
  ...       ............     .......
第j-1列:     ...........   j-1个元素

综上,

下标为:

对角矩阵:

对角矩阵又称为带状矩阵,是指在

的矩阵中,非零元素集中在主对角线及其两侧,共
(奇数)条对角线的带状区域内,称为
对角矩阵.

ee55f8dc5d3dae7dc6c83869ba769071.png

为了节省空间,第一行前面和最后一行后面的d个0可以不存储,“掐头去尾”,需要

个空间。

fa02bf85b7d114299e05b872dac6a352.png

60b1707ae6969b1b297c708bf5ad8574.png

96e01d1e853db4cdb1906b6d97215829.png

例题:一个1000阶的三对角矩阵A,将其按行存放在一维数组B中,

存放在
中,
存放在B数组的下标是多少?

解:

由三对角矩阵得:

又|i-j|=0<d,故k=(30-1)*3=87

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值