¿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.


Respuestas:


21

Lista de argumentos

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

Pruébalo en línea!


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])')

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


2
Creo que esta respuesta es la única que hasta ahora es válida Octave y Matlab.
Batman el

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.