我有一个元素列表,我正在使用Enum.chunk_every
方法将其转换为列表列表。
代码是这样的:
matrix = Enum.chunk_every(list_1d, num_cols)
Now I want to loop over the matrix and access the neighbors
如果我有列表[1,2,3,4,5,6,1,2,3],它就会转换成3X3矩阵,如:
[[1,2,3],[4,5,6],[1,2,3]]
现在我如何循环这个矩阵?如果我想访问元素的邻居怎么办?例如,5的邻居是2,4,6和2。
我可以看到递归是一种可行的方式,但这将如何运作?
答案 0 :(得分:0)
有很多方法可以解决这个问题,我认为您应该首先考虑您的用例(矩阵的大小,矩阵的数量,访问次数......)并相应地调整您的数据结构。
尽管如此,这是一个简单的实现(在Erlang shell中,我让你适应elixir):
1> L = [[1,2,3], [4,5,6], [1,2,3]].
[[1,2,3],[4,5,6],[1,2,3]]
2> Get = fun(I,J,L) ->
try
V = lists:nth(I,lists:nth(J,L)),
{ok,V}
catch
_:_ -> {error,out_of_bound}
end
end.
#Fun<erl_eval.18.99386804>
3> Get(1,2,L).
{ok,4}
4> Get(2,3,L).
{ok,2}
5> Get(2,4,L).
{error,out_of_bound}
6> Neighbor = fun(I,J,L) ->
[ V || {I1,J1} <- [{I,J-1},{I-1,J},{I+1,J},{I,J+1}],
{ok,V} <- [Get(I1,J1,L)]
]
end.
#Fun<erl_eval.18.99386804>
7> Neighbor(2,2,L).
[2,4,6,2]
8> Neighbor(1,2,L).
[1,5,1]
9>
备注:我喜欢列表理解,您可能更喜欢使用列表:在这种情况下使用map。此代码效率不高,因为它解析列表4次以获取邻居。唯一的好处是它是直的&#34;。所以应该很容易阅读。