Ответ 1
Упрощая уже предоставленные решения, вы можете сделать это как можно меньше:
-module(transp).
-export([transpose/1]).
transpose([[]|_]) -> [];
transpose(M) ->
[lists:map(fun hd/1, M) | transpose(lists:map(fun tl/1, M))].
Для такой матрицы, как показано ниже, преобразуйте ее, скажем, на 90 градусов во вторую матрицу ниже. Как бы вы сделали это самым чистым способом? Предпочтительными являются короткие/сжатые/четкие решения, где точка легко понять.
С
[[A1,A2,A3],
[B1,B2,B3],
[C1,C2,C3]]
Для
[[A1,B1,C1],
[A2,B2,C2],
[A3,B3,C3]]
Изменить: Я понимаю, что непонятно из оригинального вопроса. Я хотел бы знать, как это сделать в Erlang.
Упрощая уже предоставленные решения, вы можете сделать это как можно меньше:
-module(transp).
-export([transpose/1]).
transpose([[]|_]) -> [];
transpose(M) ->
[lists:map(fun hd/1, M) | transpose(lists:map(fun tl/1, M))].
В языках функционального программирования обычным подходом для транспонирования матрицы является использование unzip
.
Здесь мое примерное решение:
-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]]
Вот реализация, которую я думаю, что я получил из стандартной библиотеки 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([]) -> [].
Компактный и слегка изгиб.
То, что вы показываете, не является вращением матрицы, а скорее транспозицией матрицы. Если вы вызываете первую матрицу A и вторую B, вы имеете
A[i,j] = B[j,i]
Чтобы перейти от A к B, вам просто нужно два вложенных цикла с я = 1 до n и j = я + 1 до n, и на каждой итерации вы меняете недиагональные записи с использованием временной переменной.