在Erlang中转置2维矩阵

时间:2011-03-22 09:41:02

标签: functional-programming erlang

给定如下的矩阵,将其转换为90度,进入下面的第二个矩阵。你会如何以最干净的方式做到这一点?简短/简洁/明确的解决方案,其中易于掌握的点是首选。

[[A1,A2,A3],
 [B1,B2,B3],
 [C1,C2,C3]]

[[A1,B1,C1],
 [A2,B2,C2],
 [A3,B3,C3]]

编辑:我意识到原始问题并不清楚。我想知道如何在 Erlang 中执行此操作。

5 个答案:

答案 0 :(得分:16)

简化已经提供的解决方案,您可以在以下内容中完成:

-module(transp).

-export([transpose/1]).

transpose([[]|_]) -> [];
transpose(M) ->
  [lists:map(fun hd/1, M) | transpose(lists:map(fun tl/1, M))].

答案 1 :(得分:4)

在函数式编程语言中,矩阵转置的常用方法是使用unzip

答案 2 :(得分:4)

这是我的示例解决方案:

-module(transp).

-export([transpose/1]).

transpose(L) ->
     transpose_do([], L).

transpose_do(Acc, [[]|_]) ->
     lists:reverse(Acc);
transpose_do(Acc, M) ->
     Row = lists:foldr(
          fun(Elem, FoldAcc) ->
                    [hd(Elem) | FoldAcc]
          end,
          [],
          M),
     transpose_do([Row|Acc], lists:map(fun(X) -> tl(X) end, M)).

测试:

1> M = [[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]].
[[a1,a2,a3],[b1,b2,b3],[c1,c2,c3]]
2> transp:transpose(M).   
[[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]]

答案 3 :(得分:4)

这是我认为我从Haskell标准库中获得的实现:

%% Transpose rows and columns in a list of lists. Works even if sublists
%% are not of same length. Empty sublists are stripped.
transpose([[X | Xs] | Xss]) ->
    [[X | [H || [H | _] <- Xss]]
     | transpose([Xs | [T || [_ | T] <- Xss]])];
transpose([[] | Xss]) -> transpose(Xss);
transpose([]) -> [].

紧凑且略微弯曲。

答案 4 :(得分:2)

您展示的不是矩阵旋转,而是矩阵换位。如果你调用第一个矩阵A和第二个B,那么你有

A[i,j] = B[j,i]

要从A到B,您只需要两个嵌套循环,其中i = 1到n,j = i + 1到n,并且在每次迭代时,您使用临时变量交换非对角线条目。