Wie tausche ich Elemente in einem Vektor mit einer anonymen Funktion in Octave aus?


15

Das Vertauschen zweier Elemente in einem Vektor / einer Matrix ist in Octave sehr einfach:

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

Leider muss ich noch einen Weg finden, um dies in einer anonymen Funktion zu tun. Die folgende Funktion ist zwar syntaktisch korrekt, gibt jedoch nur die beiden Elemente zurück, die vertauscht werden, nicht den gesamten xVektor:

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

Gibt es eine Möglichkeit, mit anonymen Funktionen auf golferische Weise das gewünschte Verhalten zu erreichen? Können auf diese Weise mehrere Elemente mit einer anonymen Funktion vertauscht werden?

Ich könnte einen Indexierungsvektor erstellen:, f=@(x)x([4,2,3,1,5])aber das dynamische Erstellen eines solchen Vektors wird wahrscheinlich auch viele Bytes benötigen.


Antworten:


21

Argumentliste

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

Probieren Sie es online!


5
Warten Sie was ? Ich hätte nie gedacht, dass das in Octave möglich ist. Dies eröffnet so viele neue Techniken ....
Sanchises

4
Was in der ...?
Stewie Griffin

1
Bitte posten Sie dies in der Frage Tipps zur Oktave! Mit dieser Technik können Sie im Grunde alles in der Argumentliste tun, sodass Sie nie wieder zwischen einer "vollständigen" und einer anonymen Funktion wählen müssen. Ich bin schockiert.
Sanchises

3
Tolle. Übrigens können Sie das Finale ;für die Zwecke der Byte-Zählung entfernen
Luis Mendo

Vielen Dank an alle. @ Sanchises Es scheint, dass Octave eine schockierende Sprache ist. Achtung! Es wird zu Tipps hinzugefügt.
rahnema1

11

Sein eval

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

Probieren Sie es online!


In Matlab können die Klammern nicht weggelassen werden:

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

9
Nur bei PPCG ist evaldie Antwort :-)
Stewie Griffin

Möchten Sie dies der Frage mit den Octave-Tipps hinzufügen ? forSchleife innerhalb einer anonymen Funktion mit evaleiner Menge von Bytes dort gespeichert, und kann es wahrscheinlich auf viele andere Herausforderungen auch tun ,,,
Stewie Griffin

Ich bin mir nicht sicher, ob es jemals golfiger ist, aber ich nehme an, Sie können es auch ohne anonyme Funktion tun: s='x([1 4])=x([4 1])';eval(s)- Ich nehme an, dass dies am interessantesten ist, wenn Sie bereits eine Funktion erstellt haben, mit der Sie mit minimalen Zeichen auswerten können.
Dennis Jaheruddin


2
Ich denke, diese Antwort ist die einzige, die sowohl für Octave als auch für Matlab gültig ist.
Batman

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.