スピル配列を使って一つの式でデカルト積を作る on Microsoft Excel

How to build a cartesian product from vectors in a single formula with spilled array.

スピル配列を使って一つの式でデカルト積を作る

複数の行ベクタからなる集合のデカルト積(直積集合)を構築したいとき、スピル配列のおかげで以下の式を使えば出来る。新しめのExcelが必要かも。入力ベクタの列数は揃っていなくても動作する。もちろん入力はVSTACKを使って構築してもいいし、可能ならスピル範囲演算子を使ってもよい。入力データにカンマが含まれている場合は、 &","&TEXTSPLIT(B,",") の両方のカンマをなんか適当な文字に置き換えて使うことができる。

=LET(
INPUT, A1:M2,
CARTESIAN_PRODUCT, DROP(REDUCE("",REDUCE(TRANSPOSE(CHOOSEROWS(INPUT,1)), SEQUENCE(ROWS(INPUT)-1,,2),LAMBDA(X,Y, TOCOL(X &","&CHOOSEROWS(INPUT,Y)))),LAMBDA(A,B, VSTACK(A,TEXTSPLIT(B,",")))),1),
FILTER(CARTESIAN_PRODUCT,BYROW(CARTESIAN_PRODUCT="",LAMBDA(X,NOT(OR(X)))))
)

直積集合 - Wikipediaの例を用いる。

Input:

                 
1 2 3 4 5 6 7 8 9 10 11 12 13

(♠がA1セルにあるとする)

Output:

Suits Ranks
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13

参考にしたサイト (Excel)TEXTSPLIT関数をスピル(複数のテキストに適用)させる - いきなり答える備忘録

Excelってすげぇや。