Транспонирование 2-мерной матрицы в Эрланге - PullRequest
11 голосов
/ 22 марта 2011

Учитывая матрицу, подобную приведенной ниже, преобразуйте ее, скажем, на 90 градусов во вторую матрицу ниже. Как бы вы поступили так самым чистым способом? Предпочтительны короткие / краткие / прозрачные решения, в которых легко понять точку.

С

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

К

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

Редактировать: Я понимаю, что это было не ясно из исходного вопроса. Я хотел бы знать, как это сделать в Erlang .

Ответы [ 5 ]

16 голосов
/ 22 октября 2011

Упрощая уже предоставленные решения, вы можете сделать это в кратчайшие сроки:

-module(transp).

-export([transpose/1]).

transpose([[]|_]) -> [];
transpose(M) ->
  [lists:map(fun hd/1, M) | transpose(lists:map(fun tl/1, M))].
4 голосов
/ 24 марта 2011

Вот реализация, которую, я думаю, я получил из стандартной библиотеки 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 голосов
/ 22 марта 2011

В функциональных языках программирования обычным подходом для транспонирования матрицы является использование unzip.

4 голосов
/ 22 марта 2011

Вот мой пример решения:

-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]]
2 голосов
/ 22 марта 2011

То, что вы показываете, это не вращение матрицы, а скорее транспонирование матрицы.Если вы вызываете первую матрицу A, а вторую B, то у вас есть

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

. Чтобы перейти от A к B, вам просто нужны два вложенных цикла с i = 1 до n и j = i + 1 до n ина каждой итерации вы меняете недиагональные записи, используя временную переменную.

...