Compte tenu d'une matrice comme ci-dessous, transformez-la, disons, à 90 degrés dans la deuxième matrice ci-dessous. Comment allez-vous faire cela de la manière la plus propre possible? Solutions courtes / succinctes / claires dans lesquelles le point est facile à saisir est préférable.
de p> à p> Edit: Strong> Je me rends compte que cela n'était pas clair de la question initiale. J'aimerais savoir comment faire cela dans
5 Réponses :
Ce que vous montrez n'est pas une rotation matricielle, mais plutôt une transposition matricielle. Si vous appelez la première matrice A et la seconde B, vous avez alors
A[i,j] = B[j,i]
Oui, mais la question était de savoir comment faire cela à Erlang.
Dans les langages de programmation fonctionnelle, l'approche habituelle de la transposition matricielle est d'utiliser Unzip code>. p>
Merci. Cela semble pointer dans la bonne direction, mais je ne vois toujours pas dans la pratique comment faire cela.
Si vous convertissez votre exemple d'une liste de listes en une liste de trois-tuples, vous pouvez utiliser Unzip3 code> directement pour expérimenter. Écrire une version de Unzip code> qui prend une liste de listes doit être simple, une fois que vous avez obtenu comment omip code> fonctionne.
Cependant, Unzip / 1 Code> et Unzip / 3 code> est limité aux matrices à deux et tridimensionnelles respectivement. Il n'y a pas de Unzip4 code>, Unzip5 code> etc. dans stdlib :-(
C'était aussi mon problème, ce qui n'était pas en mesure de généraliser la version Unzip.
Voici mon exemple de solution: test: p>
Au fait, cela fonctionne pour les matrices de toutes tailles, non seulement pour les matrices carrées; e. g. [[[A1, A2, A3, A4], [B1, B2, B3, B4], [C1, C2, C3, C4], [D1, D2, D3, D4]] Code> sera également faire comme une entrée ;-)
C'est une bonne réponse en effet!
Bien sûr, je voulais dire [[A1, A2, A3], [B1, B2, B3], [C1, C2, C3], [D1, D2, D3]] Code> dans mon premier commentaire ci-dessus.
Voici une implémentation que je pense avoir de la bibliothèque standard HASKELLL:
%% 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([]) -> [].
Pour toute personne curieuse, la version Elixir de ce serait: def transpose ([[x | xs] | xss]), faire: [[x | (pour [h | _] <- XSS, faire: h)] | transposer ([xs | (pour [_ | t] <- xss, faire: t)])] code> Vous devriez pouvoir traduire le reste de la ci-dessus suffisamment facilement. Je ne peux pas coller le tout ici parce que Stupid Stackoverflow commentaire limitations ™
Simplifier les solutions déjà données, vous pouvez le faire aussi court que:
-module(transp). -export([transpose/1]). transpose([[]|_]) -> []; transpose(M) -> [lists:map(fun hd/1, M) | transpose(lists:map(fun tl/1, M))].
Solution testée - c'était ce que je pensais.
J'aime cette solution, très courte et élégante, et facile à convaincre que cela doit être correct.
Cela s'appelle transposer la matrice: A [J, I] = A [I, J]
Merci; Je change le titre.