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.


Odpowiedzi:


21

Lista argumentów

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

Wypróbuj online!


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

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


2
Myślę, że ta odpowiedź jest jedyną taką, która jest zarówno ważna Octave, jak i Matlab.
Batman

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.