在Erlang中实现N维数组

qyuhtwio  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(145)

我有一个Erlang项目需要生成一个数组索引的嵌套列表。也许使用arrays:会是一个快速的解决方案,但是我想看看没有那个模块是如何完成的。
如果知道数组的维数,创建数组索引的嵌套列表可以在一行中完成。

array2Dim(M,N) -> [[[X,Y] || X <- lists:seq(1,N)] || Y <- lists:seq(1,M)].

我一直在努力实现一个函数,比如arrayNDim/1,它将获取一个未知长度的包含维度的列表[D1,D2,..., Dn],以生成D1 x D2 x...,Dn数组的索引。
我曾考虑过将产卵过程作为一个“齿轮系”来产生结构,但我怀疑解决方案可能要简单得多。

u2nhd7ah

u2nhd7ah1#

最明显的解决方案是使用列表[1,...,D1], [1..,D2],...,[1...Dn]的笛卡尔积。正如问题中的笛卡尔积在列表解析中很容易,但只有当因子的数量已知时才是直接的。我最终做的是写一个广义外积函数outer/3,它以两个列表和一个乘积函数作为参数。通过取fun(X,Y) -> [X,Y] end作为乘积,并明智地使用lists:flatten/2,我们 * 几乎 * 得到笛卡尔积。我说 * 几乎 * 是因为结果不是坐标树,而是坐标的扁平列表[[1,..,1],[1,..,2],...]。对于我的目的来说,这就足够了。
其他有趣的解决方案(我还没有完全实现这些作为练习)是:使用一系列进程,每个进程都显示一个计数器,如问题中所示;以及充分利用Erlang的函数特性,从模板中生成类似于嵌套for循环的函数。

相关问题