为笛卡尔积运算而生的Reduce(Excel函数集团)
我要是没记错,Reduce这词是减少的意思,可是当他作为Excel函数出现时,我真没看出哪里Reduce了……
好吧,其实可以换种理解,缩减了嵌套(帮助里写的是“将数组缩减为累计值)。
来来来,把下面不规则的A:D列的数据整成F2:K7这样一堆,函数公式要怎么写?
这要搁以前,就得先把A2:A4和转置后的B2:B3进行连接后拉成一列,再和转置后的C2:C4进行连接后拉成一列,再和……
这还好只有四列啊,万一有40列呢?
Reduce就不用这么折腾,公式写成:
=WRAPROWS(REDUCE(A2:A4,B2:D2,LAMBDA(a,b,TOCOL(a&TOROW(OFFSET(b,,,9),1)))),6)
Reduce的基础用法是3个,哦不对,4个参数:
=REDUCE(初始值, 数组, LAMBDA(a,b,运算))
其中的a和b是Lambda自定义的名称,不叫ab叫xy或者ij……都行。
当初始值当挂一个逗号的时候,Lambda中的运算不关a什么事,否则a就是初始值;至于这个b……
就以上面这个公式为例:
Offset(b,,,9),这里的b在第一次运算的时候,是B2:D2里的B2,向下扩展9个单元格后变成这样:
再用Torow转成一行,并且加上第二个参数1,就让空统统消失,变成了一行两列两个单元格{"A","B"}。如此一来,a,也就是A2:A4和他进行连接,就顺利把每种组合都弄出来了。
ToCol的作用就是把这样一个矩阵转成一列。
到这一步,就完成了第一次运算,接下来的运算过程和上面完全相同,只不过a和b发生了变化,a变成了上述运算出来的结果,b变成了B2:D2中的第二个值C2,最后生成的结果,咳咳,我就不截图了,太长……
第三次运算,第三次运算还有啥好说的,就那么回事了。
最终的结果就是一列36行,这个结果,就是传说中的笛卡尔积。
36行有点长,所以又用了个Wraprows给折腾成了一个矩阵,方便我截图的,可以忽略。