Octaveの匿名関数を使用してベクターの要素を交換する方法は?


15

Octaveでは、ベクトル/マトリックス内の2つの要素を交換するのは非常に簡単です。

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

残念ながら、匿名関数内でこれを行う方法をまだ見つけていません。以下の関数は構文的には正しいですが、xベクトル全体ではなく、スワップされる2つの要素のみを返します。

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

匿名関数を使用してゴルフのように望ましい動作を達成する方法はありますか?無名関数を使用して、この方法で複数の要素を交換できますか?

私は可能性がインデックスベクトルを作成しますf=@(x)x([4,2,3,1,5])が、動的なベクトルを作成する可能性があまりにもバイトの多くがかかります。


回答:


21

引数リスト

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

オンラインでお試しください!


5
ちょっと待っ?Octaveでこれが可能だとは知らなかった。これにより、非常に多くの新しい手法が可能になります
。...-Sanchises


1
これをOctaveの質問の質問に投稿してください!この手法を使用すると、基本的に引数リストのすべてを実行できるため、「完全な」関数と匿名関数を再度選択する必要はありません。びっくりしました。
-Sanchises

3
すごい。ところで、;バイトカウントの目的でファイナルを削除できます
ルイスメンドー

すべての。@ Sanchisesに感謝Octaveは衝撃的な言語のようです。注意してください!ヒントに追加されます。
rahnema1

11

である eval

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

オンラインでお試しください!


Matlabでは、括弧は省略できません:

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

9
PPCGにのみeval答えがあります:
Stewie Griffin

これをOctaveのヒントの質問に追加しますか?そこに保存された多くのバイトforを使用して匿名関数内でループし、evalおそらく他の多くの挑戦でもそれを行うことができます、、、
Stewie Griffin

ゴルファーになるかどうかはわかりませんが、匿名関数がなくてもできると思います:s='x([1 4])=x([4 1])';eval(s)-最小限の文字でevalを行う関数をすでに作成している場合、これはほとんど興味深いと思います。
デニスジャヘルディン


2
これまでのところ、この答えはOctaveとMatlabの両方で有効だと思います。
バットマン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.