Bagaimana cara menukar elemen dalam vektor menggunakan fungsi anonim di Oktaf?

15

Menukar dua elemen dalam vektor / matriks sangat sederhana dalam Oktaf:

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

Sayangnya, saya belum menemukan cara untuk melakukan ini di dalam fungsi anonim. Sementara fungsi di bawah ini secara sintaksis benar, itu hanya mengembalikan dua elemen yang ditukar, bukan seluruh xvektor:

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

Apakah ada cara untuk mencapai perilaku yang diinginkan menggunakan fungsi anonim dengan cara golf? Bisakah beberapa elemen ditukar dengan cara ini menggunakan fungsi anonim?

Saya dapat membuat vektor pengindeksan:, f=@(x)x([4,2,3,1,5])tetapi membuat vektor seperti itu secara dinamis kemungkinan akan membutuhkan banyak byte juga.

Stewie Griffin
sumber
Meta postingan yang relevan .
Stewie Griffin

Jawaban:

21

Daftar Argumen

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

Cobalah online!

rahnema1
sumber
5
Tunggu apa ? Saya tidak pernah tahu ini mungkin di Octave. Ini membuka begitu banyak teknik baru ....
Sanchises
4
Apa yang ada di ...?
Stewie Griffin
1
Silakan posting ini di Tips untuk pertanyaan Oktaf! Dengan teknik ini, pada dasarnya Anda bisa melakukan semua yang ada di daftar argumen, jadi Anda tidak perlu memilih antara fungsi 'penuh' dan anonim lagi. Saya terkejut.
Sanchises
3
Luar biasa. BTW, Anda dapat menghapus final ;untuk keperluan byte byte
Luis Mendo
Terima kasih untuk semuanya. @ Sanchises Tampaknya Oktaf adalah bahasa yang mengejutkan. Hati-hati! Itu ditambahkan ke tips.
rahnema1
11

Menjadi eval

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

Cobalah online!


Di Matlab tanda kurung tidak dapat dihilangkan:

f=@(x)eval('x([4 1])=x([1 4])')
Luis Mendo
sumber
9
Hanya di PPCG evaljawabannya :-)
Stewie Griffin
Apakah Anda ingin menambahkan ini ke pertanyaan kiat Oktaf? forloop di dalam fungsi anonim menggunakan evalbanyak byte yang disimpan di sana, dan mungkin dapat melakukannya pada banyak tantangan lain juga ,,,
Stewie Griffin
Tidak yakin apakah ini golf, tetapi saya kira Anda dapat melakukannya bahkan tanpa fungsi anonim: s='x([1 4])=x([4 1])';eval(s)- Saya kira ini sebagian besar menarik jika Anda sudah membuat fungsi untuk melakukan eval dengan karakter minimal.
Dennis Jaheruddin
1
Ditambahkan :)
Stewie Griffin
2
Saya pikir jawaban ini adalah satu-satunya yang sejauh ini adalah Oktaf dan Matlab yang valid.
Batman
8

Array sel

Salah satu opsi adalah menggunakan array sel, seperti ini:

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

Cobalah online!

Stewie Griffin
sumber
Yang bagus! Mengingatkan saya pada trik ini
Luis Mendo