ExcelHome技术论坛

标题: 我对数组与数组运算的认识(欢迎探讨) [打印本页]

作者: gouweicao78    时间: 2009-8-5 23:14
标题: 我对数组与数组运算的认识(欢迎探讨)
本帖最后由 象山海鲜 于 2019-4-26 15:25 编辑

【声明】原创文章,非允勿转
【理清概念】
理清概念,不要混淆数组、数组公式。
数组,就是元素的集合,按行、列进行排列。单行或单列的数组是一维数组,多行多列(含2行2列)的数组是二维数组。
数组公式,仅仅是对按了ctrl+shift+enter结束公式的编辑方式的一种称呼,与数组完全是两码事。

【运算规律】
1、单值x与数组arry运算:执行x与arry中每一个元素分别运算并返回结果,也就是与arry本身行列、尺寸一样的结果。
例1、2*{1,2;3,4;5,6},执行2*1、2*2、2*3……2*6运算,并返回3行2列的结果{2,4;6,8;10,12}
例2、"A"&{"B","C"}返回{"AB","AC"}
例3、"A"={"B","A","C"}返回{FALSE,TRUE,FALSE}
(, 下载次数: 308)
2、同向一维数组运算:执行arry1与arry2对应位置的元素分别运算并返回结果。要求arry1与arry2尺寸必须相同,否则多余部分返回错误
例1、{1;2;3}*{4;5;6}返回{4;10;18}
例2、{1,2,3,4}*{4,5,6}返回{4,10,18,#N/A}
(, 下载次数: 255)

3、异向一维数组运算:执行arry1的每一元素与arry2的每一元素分别运算并返回结果,得到两个数组的行数*列数个元素,也就是M行数组与N列数组运算结果为M*N的矩阵。
例1、{1;2;3}*{4,5,6,7,8},执行1*4、1*5、……1*8、2*4、2*5……3*8,返回{4,5,6,7,8;8,10,12,14,16;12,15,18,21,24}
(, 下载次数: 259)

4、一维数组与二维数组运算:要求二维数组其中一个方向与一维数组同向同尺寸,比如M*N的二维数组与M行或者N列的数组运算,在同向的运算类似同向一维数组之间的位置对应,在异向的运算则类似单值与数组之间的一一运算。超出尺寸范围都返回错误值。
例:{1,2,3,4}*{1,2,3,4,5;6,7,8,9,10}即4列一维数组与2行5列数组运算,列方向上两个数组运算按位置一一对应的,不足部分用#N/A补齐,行方向上则是一对多的运算,返回{1,4,9,16,#N/A;6,14,24,36,#N/A}。
(, 下载次数: 183)
5、二维数组之间运算:要求尺寸相同,并执行相同位置元素一一对应的运算,超出尺寸部分返回错误。
例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*4,其余部分用#N/A补齐,返回={1,4,#N/A;12,20,#N/A;#N/A,#N/A,#N/A}
(, 下载次数: 291)

补充内容 (2017-10-29 08:54):
在ExcelHome技术论坛的最佳学习方法:http://club.excelhome.net/thread-117862-1-1.html
作者: gouweicao78    时间: 2009-8-5 23:16
标题: 数组尺寸自适应观点
对于1楼的几种数组间的直接运算,还有一种观点就是:数组尺寸自适应变化,小的适应大的。
比如:
例1、2*{1,2;3,4;5,6}——将2视为一个小数组,自动跟随大数组的尺寸变化为{2,2;2,2;2,2},再执行二维数组间同位置元素一一对应运算。
(, 下载次数: 212)
例2、{1,2,3,4}*{4,5,6}——将{4,5,6}自动随大数组尺寸变化为{4,5,6,#N/A},再执行同向同尺寸一维数组间同位置元素一一对应运算。
例3、{1;2;3}*{4,5,6,7,8}——对于arry1来说,arry2的列方向是大尺寸,反之对于arry2来说,arry1的行方向是大尺寸,因此分别变化为:{1,1,1,1,1;2,2,2,2,2;3,3,3,3,3}*{4,5,6,7,8;4,5,6,7,8;4,5,6,7,8},再执行二维数组间同位置元素一一对应运算。
(, 下载次数: 230)
例4、{1,2,3}*{1,2,3,4;5,6,7,8}——将{1,2,3}变为{1,2,3,#N/A;1,2,3,#N/A}再执行二维数组间同位置元素一一对应运算。
例5、{1,2;3,4}*{1,2,3;4,5,6;7,8,9}将{1,2;3,4}变为{1,2,#N/A;3,4,#N/A;#N/A,#N/A,#N/A},再执行二维数组间同位置元素一一对应运算。
(, 下载次数: 253)

也就是说数组之间都可以看成二维(一维数组可以看成二维的其中一维尺寸为1),把尺寸统一了,同方向上尺寸不足部分用#N/A填补,不同方向上的则复制小尺寸数组,不足部分也用#N/A填补。

这种理解方式,比较容易记。

[ 本帖最后由 gouweicao78 于 2009-8-5 23:18 编辑 ]
作者: gouweicao78    时间: 2009-8-5 23:17
前面阐述的是数组之间的直接运算,比如直接比较、文本合并、直接四则运算等。有些数组运算,是通过函数完成的,比如MMULT函数对于arry1、arry2的尺寸要求和运算规则与上面则不同,这是由于函数自身的原理不同,但本帖不准备说这些。

把1楼的常量数组,把元素都放在单元格中可以得到同样的结果,比如:{1;2;3}*{4,5,6,7}可以看为A1:A3*B1:E1,等等。
之所以选择常量数组来作例子,是因为常量数组的表述仅到二维。而单元格区域(也可以算是数组的一种存在方式),则可能存在多维引用的情况,反而不利理清思路。

从上面这些例子看,数组运算要注意几个重要特性:
1、对数组的方向、尺寸的要求:超尺寸的部分是不被接受的。
2、元素的位置对应关系:“数组”一词在繁体版中称为“阵列”,个人觉得更有这种位置关系的味道。
3、数组运算在于“分别”,而不似SUM(A1:A3)或COUNT(A1:C10)之类的,一股脑儿就算个结果出来。
4、用1楼比较枯燥一点的观点来看,同向一维数组运算,结果不会因为数组叠加多出其它的维度来,而异向一维数组的运算可以叠加出二维的结果。用2楼的数组尺寸自适应观点来看,也可以视为:为了运算,先自身变身多出其它维度来,再运算。
总之,常量数组的维度止于二维。


单元格区域数组的运算中,所有一维、二维的运算都与常量数组有相同情况,但是对于引用函数返回的单元格引用,则可以因为参数是数组产生叠加,返回超过二维的多维引用(另帖阐述)。
作者: biaotiger1    时间: 2009-8-5 23:27
学习了
谢谢斑竹
作者: 求师学艺    时间: 2009-8-5 23:52
请问版主,有没有计算速度快一些的数组公式,特别是汇总或查询中常用的,版主能否介绍介绍。谢谢!
作者: gouweicao78    时间: 2009-8-6 10:35
原帖由 求师学艺 于 2009-8-5 23:52 发表
请问版主,有没有计算速度快一些的数组公式,特别是汇总或查询中常用的,版主能否介绍介绍。谢谢!


关于公式的运算速度不在本帖讨论范围,呵呵。
但有些汇总和查询,都可以通过其他方法解决,比如透视表、或增加辅助列(《Excel函数与公式实战技巧精粹》的实例作证篇有写),还有,对具体公式进行优化。具体的问题,请另行发帖求助或搜索相关资料。
作者: 求师学艺    时间: 2009-8-6 11:50
谢谢!gouweicao78 版主,你曾经帮助我很多,再次表示感谢。
作者: liucs1983    时间: 2009-8-6 12:18
谢谢版主,学习了
作者: Paul_Y    时间: 2009-8-6 15:00
谢谢了,版主辛苦。
作者: wygrl    时间: 2009-8-6 17:00
受教!

版主辛苦!
作者: 刘志文    时间: 2009-8-29 15:57
gouweicao78 版主举重若轻!佩服!
作者: 雪孩儿    时间: 2009-9-24 15:22
谢谢版主,版主辛苦了!
作者: wjzwang    时间: 2009-9-29 15:39
学习了,草版!!
有时候我把它看成一个中药铺的大药柜,把所有的数据分别放在里面,要什么取什么
作者: ayykanshijie    时间: 2009-9-29 16:02
有点线性代数的 味道
但是到了二维和二维的时候就不是那么回事了哈哈
学习了 谢谢
作者: gouweicao78    时间: 2009-9-29 17:05
数组的运算规则,对于“多维”引用的理解,有一定的帮助。

这也是检查常见公式错误的一个基础知识点。
作者: 玄空    时间: 2009-9-29 17:26
谢谢版主,先下了学习学习。
作者: xiangzi728    时间: 2009-9-29 17:52
谢谢版主,版主辛苦了!
作者: bibisin    时间: 2009-9-30 23:25
谢谢LZ分享,学习了
作者: yukisakura    时间: 2009-10-10 16:18
谢谢,原来逗号和分号是有区别的,我一直以为是一样的,呵呵,我是菜鸟啊
作者: gouweicao78    时间: 2009-10-10 16:27
逗号间隔的是“列”,分号间隔的是“行”
作者: ydflois    时间: 2009-10-14 22:13
感谢楼主无私奉献,辛苦您了!
作者: wxbjw    时间: 2009-10-16 20:54
还是有些看不太懂。
作者: acewel    时间: 2009-10-20 07:43
gouweicao78版主将自己对数组的理解用大家都能理解的语言讲述出来,真是一位很有水平的教育家!但是在当前这个应用为王的时代,缺少了与理论讲述同样精彩的应用实例,总感觉这个贴子没有写完!
作者: gouweicao78    时间: 2009-10-20 09:08
谢谢acewel的关注和意见。
这个帖子,并不是要讲“应用”的,但应用数组公式来解决问题的时候,却都离不开这个帖中的理论。如果要说“数组公式的应用”——未免又太泛了,随便翻开几个函数版的帖子就有了。

写此帖,是对论坛中部分类似疑问帖、甚至是“启蒙”帖的一个勘误。经常会碰到有人提问有哪些函数是“数组函数”啊、为什么=SUMPRODUCT(A1:A10*B2:B12)、或者=SUMPRODUCT(A1:C10*B11:C11)会出错啊等等问题,经常写出“尺寸不匹配”的“数组运算”的公式,结果越出错,就越对“数组”二字望而生畏敬而远之。因此,不妨把这个帖记个标记,等到出错的时候来查证一下,再回首看看错误的公式,自然会更深入的明白这些道理。
作者: onthetrip    时间: 2009-10-23 08:23
怎么现在才看到这帖,害自己对数组的运算规则在黑暗中苦苦摸索,也不得要领
个人觉得一楼的观点虽然枯燥,但只要静下心来阅读,还是比较容易理解;而二楼的观点还暂时不能理解
感谢版主
==========================================================================
现在回过头来看,觉得二楼自适应观点才是数组运算的真正规律,特别对于三个以上数组同时运算的时候(,每个数组都得事先演变成行和列最多(行和列最多不一定存在于同一个数组中)的数组然后参与运算,如={1,2}*{3,4,6}*{1,2;3,5}就会先演变成{1,2,#N/A;1,2,#N/A}*{3,4,6;3,4,6}*{1,2,#N/A;3,5,#N/A}后再进行运算
不知道这次理解对不对。。。。。。

[ 本帖最后由 onthetrip 于 2009-10-27 16:28 编辑 ]
作者: killsoft    时间: 2009-10-30 14:51
感谢楼主,特别是只适应观点,本人有相同但是解释不一样的观点,有时间来讨论一下

[ 本帖最后由 killsoft 于 2009-11-13 16:52 编辑 ]
作者: gouweicao78    时间: 2009-10-31 09:37
标题: 回复 26楼 killsoft 的帖子
欢迎讨论。
作者: 开心萝卜惠州    时间: 2009-10-31 11:49
先感谢,再慢慢学习!
作者: ymiybpdcdp    时间: 2009-11-5 23:28
希望版主继续写下去。
作者: ymiybpdcdp    时间: 2009-11-11 18:16
谢谢草版主,向您学习、致敬!
作者: killsoft    时间: 2009-11-13 16:53
原帖由 gouweicao78 于 2009-10-31 09:37 发表
欢迎讨论。

这是本人对数组运算的一些浅薄认识,请版主指教(其实跟您讲的意思一样)
作者: liechun1983    时间: 2009-11-16 20:01
谢谢版主了!!!
作者: heaven2007    时间: 2009-11-17 00:45
长见识了,谢谢啊!
作者: 杏花雨V翟    时间: 2009-11-17 08:25
通俗易懂 受益匪浅
作者: w1212003    时间: 2009-11-27 15:03
不错。学习了一下。
作者: liechun1983    时间: 2009-12-5 11:53
谢了,版主!!!
作者: losren    时间: 2009-12-7 13:20
谢谢版主,我这一段时间刚好要用到!!
作者: foodorwater    时间: 2009-12-18 08:29
好帖子,觀摩學習啊。
作者: chaxiaoming    时间: 2009-12-20 11:19
不错,受教了!!!
作者: ggsmart    时间: 2009-12-21 13:07
标题: 回复 31楼 killsoft 的帖子
数组与数组计算,返回一个新的数组。返回的数组的行数与参与计算的数组中行数较大的数组的行数相同,列数与列数较大的数组的列数相同。
行、列数不相同时,数组会自动扩充。
参照:http://club.excelhome.net/viewth ... p;page=1#pid3386393

[ 本帖最后由 ggsmart 于 2010-9-28 09:33 编辑 ]
作者: lgcmeli    时间: 2010-1-5 16:55
数组自适应扩展,有意思。
作者: biansui    时间: 2010-1-6 21:56
太厉害了  在这里可以学习很多东西
作者: cd6979    时间: 2010-1-14 21:28
學習了........................
作者: wjl999    时间: 2010-1-26 23:27
学习了,草版!!
作者: 提拉米苏08    时间: 2010-1-29 13:43
学习了
作者: 悉心    时间: 2010-1-29 23:33
学习了,谢谢版主!
作者: 苍龙楚水    时间: 2010-1-30 20:35
现在就很清楚了。
作者: mths888    时间: 2010-2-1 16:27
辛苦啦!!!
作者: laoli200453    时间: 2010-2-3 22:24
谢谢了,版主辛苦。
作者: 学问者    时间: 2010-2-4 15:22
路过,学习了。
作者: goldincc    时间: 2010-2-4 15:50
还是比较复杂的啊
作者: dgxsdr    时间: 2010-2-4 15:53
感谢版主分享!
作者: 天命兔翁    时间: 2010-2-4 20:06
看后,感觉数组很复杂哟。
作者: slywtj123    时间: 2010-2-4 20:10
我的体会是,学习数组一定要有一定的基础!
作者: 岭南人家    时间: 2010-2-4 22:09
先项再看!搬个板凳坐下慢慢看。
作者: alwstr    时间: 2010-3-2 11:11
谢谢版主分享你的知识
使我对数组有更深一步的认识
作者: leezhihong    时间: 2010-3-2 17:11
看了LZ讲解,弄懂了数组的运算过程,谢谢
作者: guideming    时间: 2010-3-19 17:44
跟着草版学数组


谢谢
作者: xuyande0771    时间: 2010-3-20 17:19
好好学一下
作者: donghan    时间: 2010-3-30 16:36
草版的都是好东西,收藏学习
作者: liaoweigxgg    时间: 2010-3-31 00:19
楼主辛苦了,谢谢。
作者: pst168    时间: 2010-4-1 13:27
学无止境,生命不息,学习不止。
跟着草版学数组。
作者: xsp0908    时间: 2010-4-2 13:35
gouweicao78版主,虽你是1978年出生的,但你真是一个无私的人,为EH作出了无私的奉献,大家感谢你!!
作者: guoyongqiang200    时间: 2010-4-2 14:16
谢谢版主,学习了。
作者: lhx120824    时间: 2010-4-3 09:53
讲得很透彻,学习了。
作者: 热炕头    时间: 2010-4-15 16:22
标题: 回复 1楼 gouweicao78 的帖子
数组里  {"我","向","你","求","教"}怎么能得到"我向你求教"?
作者: hotq40    时间: 2010-4-15 16:29
哈哈,其实就是大学时学的线性代数。
作者: lgh978    时间: 2010-4-15 21:02
谢谢版主,学习了
作者: Eric_f    时间: 2010-4-15 21:41
谢谢,图文并茂,简单易懂!
作者: 龙卷风之恋    时间: 2010-4-16 08:56
楼主的思路让人耳目一新
作者: 爱睡猪    时间: 2010-4-18 14:23
谢谢斑竹的讲解
作者: 龙猫9    时间: 2010-4-21 13:24
学习了,谢谢版主的讲解
作者: jancy_jc    时间: 2010-4-21 20:52
好高深啊!只能看着!
作者: wujian_pd    时间: 2010-4-22 00:37
谢谢版主,学习了
作者: xxh7836    时间: 2010-4-25 12:15
谢谢版主,最近正准备学数组,可一点基础都没有,很担心不能学好,现在看版主的帖子通俗易懂,有点信心能弄懂它们了
作者: wggx4    时间: 2010-4-25 22:08
谢谢斑竹的帖子了
作者: cwcvincent    时间: 2010-4-29 10:21
图文解说很清楚易懂,谢谢
作者: xgy0214dxy    时间: 2010-4-29 14:55
学习,谢谢
作者: 赵文竹    时间: 2010-4-29 15:40
学习中,谢谢老师!
作者: wgjxxx    时间: 2010-5-12 20:56
讲解的很详细,非常适合我这样的初学者……
谢谢楼主分享!!!学习了……
作者: 天遥    时间: 2010-5-13 16:03
感谢分享....收藏慢慢看
作者: lhx120824    时间: 2010-5-15 14:19
浅显易懂。
作者: feisail    时间: 2010-5-19 15:59
学习了,大有裨益。
作者: fanchl8109    时间: 2010-5-20 10:41
请问斑竹,average函数能用数组吗?
特别是该函数的参数是不连续的,而且参数又超过函数对参数个数的限制的情况下
作者: Kimez12    时间: 2010-5-20 19:55
还是斑竹讲的清楚明白,浅显易懂啊。
作者: gouweicao78    时间: 2010-5-21 08:55
标题: 回复 85楼 fanchl8109 的帖子
请举例,最好上传附件,以便理解你的问题。
作者: 52youxi88    时间: 2010-5-21 10:11
数组的运用得好的确有很大的收益,但对于我们初学的人来说很容易搞混乱,努力中
作者: bopanda    时间: 2010-5-21 15:11
谢谢拉
作者: 蜀郭浪君    时间: 2010-5-29 00:11
明天来看看
作者: 天堑小舟    时间: 2010-5-29 13:48
数组这玩意儿有点玄!
学习学习......
作者: reason6968    时间: 2010-6-3 21:34
参加了数组培训后,返回来再看楼主的帖子,有种提壶灌顶的感觉,谢了!
作者: dytvnet    时间: 2010-6-4 08:58
这里高手真多,好好学习学习!
作者: baicjuan    时间: 2010-6-4 16:35
虽然没太看懂,但仍谢谢楼主
作者: 汪汪519    时间: 2010-6-26 13:23
太高深,看不明白,但我相信,总有一天我能看明白
作者: wuhanhan    时间: 2010-7-5 21:15
学习,更进一步的认识了数组
作者: renqiang851224    时间: 2010-7-6 12:50
标题: 回复 3楼 gouweicao78 的帖子
谢谢分享,版主辛苦。
作者: XINGHUAQIZHONG    时间: 2010-7-6 13:04
收获不少,谢谢了。
作者: xifengshou    时间: 2010-7-6 18:03
看了,获益匪浅
作者: zm0115    时间: 2010-7-7 09:47
今天突然有看到狗尾草斑竹的这个帖子,我也来理解一下自己认为的“数组自适应”。见下图。
(, 下载次数: 71)
作者: xihabang    时间: 2010-7-7 11:43
还是狗尾巴好 ..




欢迎光临 ExcelHome技术论坛 (https://club.excelhome.net/) Powered by Discuz! X3.4