スピル配列を使って一つの式でデカルト積を作る 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ってすげぇや。