Comment permuter des éléments dans un vecteur en utilisant une fonction anonyme dans Octave?


15

L'échange de deux éléments dans un vecteur / matrice est très simple dans Octave:

x='abcde';
x([4,1])=x([1,4])
x = 
   dbcae

Malheureusement, je n'ai pas encore trouvé de moyen de le faire dans une fonction anonyme. Bien que la fonction ci-dessous soit syntaxiquement correcte, elle ne renvoie que les deux éléments qui sont échangés, pas le xvecteur entier :

f=@(x)(x([4,1])=x([1,4]))
f(x)
ans = 
     ad

Existe-t-il un moyen d'atteindre le comportement souhaité en utilisant des fonctions anonymes de manière golfique? Plusieurs éléments peuvent-ils être échangés de cette façon à l'aide d'une fonction anonyme?

Je pourrais créer un vecteur d'indexation:, f=@(x)x([4,2,3,1,5])mais la création dynamique d'un tel vecteur prendra probablement beaucoup d'octets également.


Réponses:


21

Liste d'arguments

f=@(x,y=x([4 1])=x([1 4]))x;

Essayez-le en ligne!


5
Attends quoi ? Je n'ai jamais su que c'était possible dans Octave. Cela ouvre tellement de nouvelles techniques ....
Sanchises

4
Quoi dans le ...?
Stewie Griffin

1
Veuillez poster ceci dans la question Astuces pour Octave! Avec cette technique, vous pouvez pratiquement tout faire dans la liste d'arguments, vous n'avez donc plus jamais besoin de choisir entre une fonction «complète» et anonyme. Je suis choqué.
Sanchises

3
Incroyable. BTW, vous pouvez supprimer la finale ;aux fins du comptage d'octets
Luis Mendo

Merci à tous. @ Sanchises Il semble qu'Octave soit un langage choquant. Faites attention! Il est ajouté aux conseils.
rahnema1

11

Être eval

f=@(x)eval"x([4 1])=x([1 4])"

Essayez-le en ligne!


Dans Matlab, les parenthèses ne peuvent pas être omises:

f=@(x)eval('x([4 1])=x([1 4])')

9
La réponse est uniquement sur PPCG eval:-)
Stewie Griffin

Voulez-vous ajouter ceci à la question des conseils Octave? forboucle à l'intérieur d'une fonction anonyme en utilisant evalbeaucoup d'économies là-bas, et peut probablement le faire sur de nombreux autres défis aussi ,,,
Stewie Griffin

Je ne sais pas s'il est jamais golfeur, mais je suppose que vous pouvez le faire même sans fonction anonyme: s='x([1 4])=x([4 1])';eval(s)- Je suppose que c'est surtout intéressant si vous avez déjà fait une fonction pour faire une évaluation avec un minimum de caractères.
Dennis Jaheruddin


2
Je pense que cette réponse est la seule à ce jour qui soit à la fois valide Octave et Matlab.
Batman

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.