¿Cómo intercambiar elementos en un vector usando una función anónima en Octave?

15

Intercambiar dos elementos en un vector / matriz es muy simple en Octave:

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

Desafortunadamente, todavía tengo que encontrar una manera de hacer esto dentro de una función anónima. Si bien la siguiente función es sintácticamente correcta, solo devuelve los dos elementos que se intercambian, no todo el xvector:

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

¿Hay alguna manera de lograr el comportamiento deseado utilizando funciones anónimas de una manera golfística? ¿Se pueden intercambiar varios elementos de esta manera usando una función anónima?

Yo podría crear un vector de indexación: f=@(x)x([4,2,3,1,5]), pero la creación de un vector tal forma dinámica es probable que tomar una gran cantidad de bytes también.

Stewie Griffin
fuente
Meta publicación relevante .
Stewie Griffin

Respuestas:

21

Lista de argumentos

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

Pruébalo en línea!

rahnema1
fuente
55
Espera que ? Nunca supe que esto era posible en Octave. Esto abre muchas técnicas nuevas ...
Sanchises
44
¿Qué pasa en el ...?
Stewie Griffin
1
¡Publique esto en la pregunta Consejos para Octave! Con esta técnica, básicamente puede hacer todo en la lista de argumentos, por lo que nunca más tendrá que elegir entre una función 'completa' y anónima. Estoy sorprendido
Sanchises
3
Increíble. Por cierto, puede eliminar la final ;para el recuento de bytes
Luis Mendo
Gracias a todos. @ Sanchises Parece que Octave es un lenguaje impactante. ¡Ten cuidado! Se agrega a las propinas.
rahnema1
11

Ser eval

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

Pruébalo en línea!


En Matlab los paréntesis no se pueden omitir:

f=@(x)eval('x([4 1])=x([1 4])')
Luis Mendo
fuente
99
Solo en PPCG está evalla respuesta :-)
Stewie Griffin
¿Desea agregar esto a la pregunta de consejos de Octave? forbucle dentro de una función anónima usando evaluna gran cantidad de bytes guardados allí, y probablemente pueda hacerlo en muchos otros desafíos también ,,,
Stewie Griffin
No estoy seguro de si alguna vez es más golfista, pero supongo que puede hacerlo incluso sin una función anónima: s='x([1 4])=x([4 1])';eval(s)- Supongo que esto es muy interesante si ya realizó una función para evaluar con caracteres mínimos.
Dennis Jaheruddin
1
Añadido :)
Stewie Griffin
2
Creo que esta respuesta es la única que hasta ahora es válida Octave y Matlab.
Batman el
8

Matriz de celdas

Una opción es usar una matriz de celdas, como esta:

f=@(x){x([1,4])=x([4,1]);x}{2}

Pruébalo en línea!

Stewie Griffin
fuente
¡Buena esa! Me recuerda a este truco
Luis Mendo