楼主 gouweicao78 |
【理清概念】 理清概念,不要混淆数组、数组公式。 数组,就是元素的集合,按行、列进行排列。单行或单列的数组是一维数组,多行多列(含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} 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} 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} 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}。 5、二维数组之间运算:要求尺寸相同,并执行相同位置元素一一对应的运算,超出尺寸部分返回错误。 例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*5,其余部分用#N/A补齐,返回={1,4,#N/A;12,20,#N/A;#N/A,#N/A,#N/A} |
2楼 gouweicao78 |
对于1楼的几种数组间的直接运算,还有一种观点就是:数组尺寸自适应变化,小的适应大的。 比如: 例1、2*{1,2;3,4;5,6}——将2视为一个小数组,自动跟随大数组的尺寸变化为{2,2;2,2;2,2},再执行二维数组间同位置元素一一对应运算。 例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},再执行二维数组间同位置元素一一对应运算。 例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},再执行二维数组间同位置元素一一对应运算。 也就是说数组之间都可以看成二维(一维数组可以看成二维的其中一维尺寸为1),把尺寸统一了,同方向上尺寸不足部分用#N/A填补,不同方向上的则复制小尺寸数组,不足部分也用#N/A填补。 这种理解方式,比较容易记。 |
3楼 gouweicao78 |
前面阐述的是数组之间的直接运算,比如直接比较、文本合并、直接四则运算等。有些数组运算,是通过函数完成的,比如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楼的数组尺寸自适应观点来看,也可以视为:为了运算,先自身变身多出其它维度来,再运算。 总之,常量数组的维度止于二维。 单元格区域数组的运算中,所有一维、二维的运算都与常量数组有相同情况,但是对于引用函数返回的单元格引用,则可以因为参数是数组产生叠加,返回超过二维的多维引用(另帖阐述)。 |
4楼 meiokok |
新人来了,慢慢消化学习 |
5楼 flower8 |
目前初级水平 正准备偏向学习数组和VBA 也是通过楼主的博客来这里(其实以前来过,但是没注册)的。多谢! |
6楼 Cowisen |
http://www.exceltip.net/thread-3498-1-1.html 楼主写得太精彩了,我也学习了。 但有一疑问,在二维数组之间运算中,如下 例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*4(是否应为4*5) |
7楼 gouweicao78 |
数组之间的运算关键词:分别 对应 土一点说“各回各家,各找各妈”。 |
8楼 sam.tan |
虽复杂点,但得好好学习. |
9楼 lrlxxqxa |
“各回各家,各找各妈”,很形象的比喻 |
10楼 wangqilong1980 |
非常好用,谢谢版主。 |
11楼 蒸蒸日上 |
顶上去,好好学习,蒸蒸日上! |
12楼 snowangle007 |
先收藏了,一有时间就看。 |
13楼 jiujiu8900 |
学习下,谢谢了 |
14楼 健康快乐123 |
讲解清楚,是个好老师 |
15楼 军港之夜 |
新来的,看着不是很懂,一维数组之间的运算有些公式里可以看到、也明白一些。可以介绍一下在什么情况下, 能用到二维数组之间运算。谢谢。 |
16楼 tyjsc |
草版太厉害了 |
17楼 谢唐 |
|
18楼 军港之夜 |
谢谢。 |
19楼 guoxiaozheng |
好像高等数学里面的矩阵,请教一下版主:这个数组是不是就是矩阵的意思? |
20楼 guoxiaozheng |
此外,斑竹的第三点:异向一维数组运算的运算,它的写法是这样那个的吗?、{1;2;3}*{4,5,6,7,8} |
21楼 gouweicao78 |
【理清概念】 理清概念,不要混淆数组、数组公式。 数组,就是元素的集合,按行、列进行排列。单行或单列的数组是一维数组,多行多列(含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} 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} 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} 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}。 5、二维数组之间运算:要求尺寸相同,并执行相同位置元素一一对应的运算,超出尺寸部分返回错误。 例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*5,其余部分用#N/A补齐,返回={1,4,#N/A;12,20,#N/A;#N/A,#N/A,#N/A} |
22楼 gouweicao78 |
对于1楼的几种数组间的直接运算,还有一种观点就是:数组尺寸自适应变化,小的适应大的。 比如: 例1、2*{1,2;3,4;5,6}——将2视为一个小数组,自动跟随大数组的尺寸变化为{2,2;2,2;2,2},再执行二维数组间同位置元素一一对应运算。 例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},再执行二维数组间同位置元素一一对应运算。 例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},再执行二维数组间同位置元素一一对应运算。 也就是说数组之间都可以看成二维(一维数组可以看成二维的其中一维尺寸为1),把尺寸统一了,同方向上尺寸不足部分用#N/A填补,不同方向上的则复制小尺寸数组,不足部分也用#N/A填补。 这种理解方式,比较容易记。 |
23楼 gouweicao78 |
前面阐述的是数组之间的直接运算,比如直接比较、文本合并、直接四则运算等。有些数组运算,是通过函数完成的,比如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楼的数组尺寸自适应观点来看,也可以视为:为了运算,先自身变身多出其它维度来,再运算。 总之,常量数组的维度止于二维。 单元格区域数组的运算中,所有一维、二维的运算都与常量数组有相同情况,但是对于引用函数返回的单元格引用,则可以因为参数是数组产生叠加,返回超过二维的多维引用(另帖阐述)。 |
24楼 meiokok |
新人来了,慢慢消化学习 |
25楼 flower8 |
目前初级水平 正准备偏向学习数组和VBA 也是通过楼主的博客来这里(其实以前来过,但是没注册)的。多谢! |
26楼 Cowisen |
http://www.exceltip.net/thread-3498-1-1.html 楼主写得太精彩了,我也学习了。 但有一疑问,在二维数组之间运算中,如下 例:{1,2;3,4}*{1,2,3;4,5,6;7,8,9}执行1*1,2*2,3*4,4*4(是否应为4*5) |
27楼 gouweicao78 |
数组之间的运算关键词:分别 对应 土一点说“各回各家,各找各妈”。 |
28楼 sam.tan |
虽复杂点,但得好好学习. |
29楼 lrlxxqxa |
“各回各家,各找各妈”,很形象的比喻 |
30楼 wangqilong1980 |
非常好用,谢谢版主。 |
31楼 200240 |
学习了,印象有深了一些 |
32楼 猪制将军 |
收藏学习了 |
33楼 ludenic |
it's very useful for me, thanks a lot. |
34楼 shenlong2006 |
对数组总感觉若即若离,杀千刀的微软什么时候能公布源代码就好了 |
35楼 尐_Oo超。超 |
数组的运算规则跟矩阵不一样么? |