我正在寻找在二维中平铺 Excel 数组的方法,如另一个数组所定义,理想情况下不使用 VBA。
为了更好地解释,我想要一个 excel 公式f(A, B)
其中 A 是布尔值且 =
[[1, 0],
[0, 1]
其中 B =
[[1, 2],
[3, 4]
并f(A, B)
根据 A 中的 bool 值对 B 进行平铺,在本例中,f(A, B) =
[[1, 2, 0, 0],
[3, 4, 0, 0],
[0, 0, 1, 2],
[0, 0, 3, 4]]
我最初的想法是=IF(MUNIT(2), {1, 2;3, 4}, {0, 0;0, 0})
,但是输出扩展得不太好。
这是我迄今为止的努力 - 希望它具有普遍性:
您还可以使用 Makearray:
(与@Scott Craner 的旧版本逻辑相同)
与 Tom 的方法类似,但稍微简短一些:
只是为了好玩,这将在旧版本中起作用:
将其拖动到足以容纳数组大小的位置。
要返回两个数组的克罗内克积,请尝试以下 Python 代码:
如果你以前从未在 Excel 中使用过 Python,请参阅:在 Excel 中开始使用 Python
替代方法 1:
为了提高更大数组的性能,您还可以尝试使用二分法:
其中
BiCOL
和BiROW
是在名称管理器中定义的自定义 lambda 函数:替代方法 2:
如果您愿意使用一种
REDUCE-VSTACK/HSTACK
方法,也可以通过成对堆叠结果来提高性能,而不是线性堆叠:有关此方法的通用版本,请参阅 Peter Bartholomew 的
MAPλ
功能:https ://gist.github.com/pbartxl替代方法 3:
另一个相对有效的选择是使用
TOCOL
和SORTBY
;WRAPROWS
然而,由于以下限制,这种方法最多只能输出 1,048,576 个元素TOCOL
:这是我在 Office 365 中的方法:
=LET(f,LAMBDA(a,b,DROP(REDUCE("",SEQUENCE(COLUMNS(a)),LAMBDA(c,d,HSTACK(c,REDUCE("",SEQUENCE(ROWS(a)),LAMBDA(e,f,VSTACK(e,b*INDEX(a,f,d))))))),1,1)),f(B1:D3,F1#))
编辑: 看 Tom Sharpe 的回答,我的回答有点类似。我整体使用了 DROP,而不是单个 REDUCE 函数,并将其包装在 LAMBDA 中以进行调用,
f
就像开篇帖子中那样。但除此之外,没有太大区别,所以如果你投票,至少也要投票给 Tom没有新的逻辑,不用
DROP
而用INDEX
,希望有更好的性能:在我的 Mac 上,这些范围大约需要 6 秒。