10
votes

Comment puis-je commander une matrice à Mathematica par sa deuxième colonne?

Imaginez que vous avez:

b = {{3, -4, 6}, {2, 0, 7}, {5, 1, 1}}


4 commentaires

Hmmm .... "Top 0.23% Cette année" (Belisarus) vs "Top 0.17% ce mois-ci" (Niels)


@Brett je ne suis pas Belisarus , Champon : D


@belisarius mes excuses! Je devrai ajouter votre nom au vérificateur orthographique de mon système. Je suis assez amusé par l'histoire de Modifier sur votre réponse ...


@Brett Je n'étais pas au courant de l'historique de modification, car je n'ai vu que Sjoerd, edit, et je l'ai considéré comme une amélioration. Regarder l'histoire est également un vote de confiance: D


6 Réponses :


21
votes

Cela fonctionne:

SortBy[a,#[[2]]&]


1 commentaires

Merci d'avoir répondu à moins d'une minute !!, tu as sauvé ma journée :-d



5
votes

Peut-être que vous pouvez utiliser cette URL: http://12000.org/my_notes/mma_matlab_control /Kernel/node99.htm

code que vous pouvez utiliser: p> xxx pré>

résultat: p>

Out[9]= {{500,23,5},{40,32,1},{300,48,2},{120,55,7}}


1 commentaires

Merci pour le lien. En fait, je voulais commander en ordre décroissant et ces travaux: Sortby [A, - # [[2]] &]



13
votes

Alternativement,

a[[Ordering[a[[All, 2]]]]]


0 commentaires

9
votes

et ici, pour le calendrier obligatoire (j'ai ajouté le tri de base trier sur les méthodes): xxx


19 commentaires

+1, bizarre. Je m'attendais à Sortby pour gagner et je ne m'attendais pas à Trier Pour que cela soit mal.


+1 Nous devrions inclure une addenda de synchronisation sur chaque question. Et merci d'avoir édité ma réponse :)


@RCollyer des timings plus intéressants ici stackoverflow.com/questions/6659227/...


@RCollyer Le résultat (code> est prévisible car il introduit une fonction de commande arbitraire.


Sur ma machine, le ratio entre les solutions de selle et de commande n'est que 1,2


@szabolcs Ouais, les timings courts ne sont pas fiables. J'ai répété un certain nombre de fois et obtenez environ 1,4


@ M.Wizard Entier, Sortby doit également une fonction de commande, basée sur la fonction de transformation arbitraire que l'utilisateur fournit. A priori, je n'aurais pas pu dire quelle manière aurait été plus efficace. Deux ordres de grandeur sont énormes.


@RCollyer, Belisarius, M.Wizard Une discussion de groupe mathématique pertinente: groups.google.com/group/comp.soft-sys.math.mathematica/... . J'ai aussi discuté de ce sujet ici: MathProgramming-Intro.org/book/node291.htmlLe_ a>, en utilisant un exemple similaire.


@Leonid, oui, j'ai probablement appris cela de Mathgroup ou de votre livre.


@ M.Wizard Je ne pense pas que vous n'êtes pas d'accord avec moi. "Fonction de commande interne" (Mes mots) = "Fonction de commande par défaut" (vos mots), "Fonction de transformation" (moi) = "décorer" (vous).


@Sjoerd Je suis sûr que vous avez vu cela plusieurs fois - il semble être un sujet fréquemment discuté. Désolé de ne pas vous inclure explicitement dans la liste - je savais que vous seriez notifié en tout cas.


@ M.Wizard Je faisais spécifiquement référence à votre première phrase. En ce qui concerne la deuxième partie: je conviens que vous devez vous attendre à ce que des fonctions externes soient plus lentes que les fonctions internes, mais dans ce cas, nous discutions des fonctions internes «décorées» qui pourraient être aussi lentes qu'une fonction externe simple. Au moins, je ne m'attendais pas à ce que la décoration des fonctions internes ferait pour la performance.


@Leonid Cette affaire est différente de ce que vous avez lié. Dans le cas de Union Nous spécifions un "même test" (et perdons l'avantage d'avoir également un "test de commande"). Dans le cas de trier nous seulement a une relation de commande.


@ M.Wizard Je comprends cela. Mon point est simplement que la synchronisation du processus de décoration et à l'aide de la fonction de commande interne par rapport à l'utilisation d'une fonction de commande externe dépend non seulement de la quantité plus rapide de la fonction de commande interne que la commande externe, mais aussi sur la vitesse de décoration (qui est une fonction externe). Apparemment, il est plus rapide, mais auriez-vous vraiment parier votre vie dessus?


@Sjoerd, je pense enfin comprendre votre point . Mes excuses. Je vais supprimer la plupart des mess ci-dessus.


À partir de la discussion ci-dessus, certaines expériences numériques, il semble que la fonction fournie par l'utilisateur soit appelée ~ 1,35 journal [n] autant de fois lors de l'utilisation de que lorsque vous utilisez < Code> Sortby . Cela nous donne un facteur d'environ 19 par rapport au rapport de synchronisation réel d'~ 100. Là où cette différence 5x provient, je peux imaginer beaucoup d'explications raisonnables, mais aucune qui n'est facilement testable.


@Monsieur. Wizard Hmmm, où l'histoire serait-elle si Einstein et Bohr avaient fait la même chose? ;-)


@Szabolcs strictement parlant, vous avez raison sur le lien vers MathGroup Post. Cependant, une partie de mon explication dans ce fil qui mentionne également les détestations générales d'évaluation de l'évaluation MS pour trier . Mon deuxième lien vers la page du livre est pour Trier spécifiquement.


@Szabolcs non, vous a raison, j'aurais dû être plus spécifique lorsque vous donnez ce lien.



4
votes

Si vos données étaient les suivantes:

SortBy[a, {#[[2]] &}]


6 commentaires

Il m'a fallu quelques heures avant de remarquer que vous auriez posté cela. Il a ensuite pris un certain temps avant d'avoir vu quel était votre point, puis il a fallu beaucoup trop longtemps avant que je comprenne votre point. Intéressant, vous auriez dû faire cela plus explicite, je suppose.


Un peu. Mon premier problème était qu'au début, je n'ai pas remarqué que vous avez légèrement modifié les données originales de la question (pour introduire le problème des «cravates»), puis je n'ai pas compris pourquoi les supports ont résolu le problème. La manière dont les liens sont résolus s'il n'y a aucune fonction de rupture supplémentaire entre les supports n'est pas documentée Afai peut dire.


Je pense que la règle de cravate dans le cas {} est simplement «d'abord venir, d'abord». Dans le cas no- {}, il trie de manière canonique. Essayez les deux sortes sur a = {{5, 1, 1}, {2, 1, 7}, {3, -4, 6}, {2, 1, 6}} par exemple.


@Sjoerd Oui, c'est ma compréhension.


@belisarius merci, cela règle alors.


Ouais. @ Sjoerdc.devries d'accord.



2
votes

juste un conseil dans ce contexte: Lorsque vous utilisez des objets non atomar tels que sqrt [...] , vous pouvez obtenir des résultats inattendus: xxx

Ceci est dû à

Trier généralement les expressions en mettant d'abord des expressions plus courtes, et puis comparer des pièces de première profondeur. (Manuel de référence Mathematica).

Toujours utiliser n, quand un tri numérique est souhaité.


3 commentaires

Bon conseil. Si "Atomar" n'est pas une faute de frappe, cela signifie-t-il quelque chose d'autre que atomique?


@Monsieur. "Une tomaine" signifie "buvons!" en espagnol


Ne semble pas que cela soit pertinent pour la question.