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.

Stewie Griffin
quelle
Relevanter Metapost .
Stewie Griffin

Antworten:

21

Argumentliste

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

Probieren Sie es online!

rahnema1
quelle
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])')
Luis Mendo
quelle
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
1
Hinzugefügt :)
Stewie Griffin
2
Ich denke, diese Antwort ist die einzige, die sowohl für Octave als auch für Matlab gültig ist.
Batman
8

Zellenarray

Eine Möglichkeit besteht darin, ein Zellenarray wie folgt zu verwenden:

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

Probieren Sie es online!

Stewie Griffin
quelle
Schön! Erinnert mich an diesen Trick
Luis Mendo