Erlang - 如何“取消”数组

时间:2014-04-05 08:13:12

标签: arrays matrix erlang tuples

我是Erlang的新手,所以这个问题可能有点基础 我有一个N ^ 2个元素的数组(我知道N),我想用N个元素分解成一个数组(或元组,并不重要),每个元素有N个元素。

即:我想转:

  

[14,20,26,20,29,38,26,38,50]
  成:
  [{14,20,26},{20,29,38},{26,38,50}}

是否有一种简单的方法或功能可以做到这一点?

感谢。

4 个答案:

答案 0 :(得分:5)

使用模式匹配:

s([X, Y, Z | Next]) ->
   [{X, Y, Z} | s(Next)];
s([]) -> [].

如果您不提供3个元素的倍数,这将失败,但这可能是您想要的。

答案 1 :(得分:0)

这应该做你想要的。

s(L,N) -> s(L,N,[]).

s([],_,R) -> lists:reverse;
s(L,N,R) ->
    {L1,L2} = lists:split(N,L),
    s(L2,[list_to_tuple(L1)|R]).

答案 2 :(得分:0)

您可以使用此功能sublist(List1, Start, Len) -> List2

  

从Start开始并使用(max)Len返回List1的子列表   元素。 Start + Len超过长度不是错误   列表。

unflatten(L, N) ->
    case N*N == length(L) of
        true -> unflatten_help(L, 1, N, []);
        false ->
            {error, "wrong list length!"}
    end.

unflatten_help(_L, Start, N, Res) when Start == (N*N + 1) ->
    lists:reverse(Res);
unflatten_help(L, Start, N, Res) ->
    Temp = lists:sublist(L, Start, N),
    unflatten_help(L, Start + N, N, [Temp | Res]). 


main() ->
    L = [14,20,26,20,29,38,26,38,50],
    unflatten(L, 3).

输出:

  

[[14,20,26],[20,29,38],[26,38,50]]

答案 3 :(得分:0)

我认为以下代码适合您:

array_to_tuples([],_) -> [];
array_to_tuples(L,N) ->
    {L1,L2} = lists:split(N,L),
    [list_to_tuple(L1)|array_to_tuples(L2,N)].

这将在N个元组中考虑N * 2个元素来分割数组。