Jak zamienić elementy w wektorze za pomocą anonimowej funkcji w Octave?

15

Zamiana dwóch elementów w wektorze / macierzy jest bardzo prosta w Octave:

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

Niestety, muszę jeszcze znaleźć sposób na wykonanie tego w anonimowej funkcji. Chociaż poniższa funkcja jest poprawna składniowo, zwraca tylko dwa zamienione elementy, a nie cały xwektor:

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

Czy istnieje sposób na osiągnięcie pożądanego zachowania za pomocą anonimowych funkcji w golfowy sposób? Czy można w ten sposób zamienić kilka elementów za pomocą anonimowej funkcji?

I mogłaby utworzyć wektor indeksowania: f=@(x)x([4,2,3,1,5]), ale tworząc taki wektor dynamicznie będzie prawdopodobnie zajmie dużo bajtów zbyt.

Stewie Griffin
źródło
Odpowiedni meta post .
Stewie Griffin,

Odpowiedzi:

21

Lista argumentów

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

Wypróbuj online!

rahnema1
źródło
5
Czekać , co ? Nigdy nie wiedziałem, że to możliwe w Octave. Otwiera to tak wiele nowych technik ....
Sanchises,
4
Co w ...?
Stewie Griffin
1
Proszę zamieścić to w pytaniu Porady dotyczące Octave! Dzięki tej technice możesz zasadniczo zrobić wszystko na liście argumentów, więc nigdy więcej nie musisz wybierać między funkcją „pełną” a anonimową. Jestem zszokowany.
Sanchises,
3
Niesamowity. BTW, możesz usunąć finał ;na potrzeby liczenia bajtów
Luis Mendo
Dzięki wszystkim. @ Sanchises Wygląda na to, że Octave to szokujący język. Bądź ostrożny! Jest dodawany do wskazówek.
rahnema1
11

Być eval

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

Wypróbuj online!


W Matlab nawiasów nie można pominąć:

f=@(x)eval('x([4 1])=x([1 4])')
Luis Mendo
źródło
9
Tylko na PPCG jest evalodpowiedź :-)
Stewie Griffin
Czy chcesz dodać to do pytania z poradami Octave? forzapętlić wewnątrz anonimowej funkcji, używając evalzaoszczędzonej tam dużej ilości bajtów, i prawdopodobnie może to zrobić także w wielu innych wyzwaniach ,,,
Stewie Griffin
Nie jestem pewien, czy kiedykolwiek jest bardziej golfowy, ale przypuszczam, że możesz to zrobić nawet bez anonimowej funkcji: s='x([1 4])=x([4 1])';eval(s)- Myślę, że jest to najbardziej interesujące, jeśli już wykonałeś funkcję eval z minimalnymi znakami.
Dennis Jaheruddin
1
Dodano :)
Stewie Griffin
2
Myślę, że ta odpowiedź jest jedyną taką, która jest zarówno ważna Octave, jak i Matlab.
Batman
8

Macierz komórek

Jedną z opcji jest użycie tablicy komórek, takiej jak ta:

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

Wypróbuj online!

Stewie Griffin
źródło
Niezłe! Przypomina mi tę sztuczkę
Luis Mendo