Làm cách nào để hoán đổi các phần tử trong một vectơ bằng hàm ẩn danh trong Octave?


15

Hoán đổi hai phần tử trong một vectơ / ma trận rất đơn giản trong Octave:

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

Thật không may, tôi vẫn chưa tìm ra cách để làm điều này trong một chức năng ẩn danh. Mặc dù hàm dưới đây đúng về mặt cú pháp, nó chỉ trả về hai phần tử được hoán đổi, không phải toàn bộ xvectơ:

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

Có cách nào để đạt được hành vi mong muốn bằng cách sử dụng các chức năng ẩn danh theo cách chơi golf không? Một số yếu tố có thể được hoán đổi theo cách này bằng cách sử dụng một chức năng ẩn danh?

Tôi có thể tạo một vectơ lập chỉ mục: f=@(x)x([4,2,3,1,5])nhưng việc tạo một vectơ như vậy có khả năng cũng sẽ mất rất nhiều byte.


Câu trả lời:


21

Danh sách đối số

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

Hãy thử trực tuyến!


5
Đợi cái gì ? Tôi chưa bao giờ biết điều này là có thể trong Octave. Điều này mở ra rất nhiều kỹ thuật mới ....
Sanchise

4
Cái gì trong ...?
Stewie Griffin

1
Xin vui lòng gửi điều này trong câu hỏi Mẹo cho Octave! Với kỹ thuật này, về cơ bản, bạn có thể thực hiện mọi thứ trong danh sách đối số, do đó bạn không bao giờ phải chọn giữa chức năng 'đầy đủ' và ẩn danh nữa. Tôi bị sốc.
Sanchise

3
Kinh ngạc. BTW, bạn có thể xóa trận chung kết ;cho mục đích đếm byte
Luis Mendo

Cảm ơn tất cả. @ Sanchises Dường như Octave là một ngôn ngữ gây sốc. Hãy cẩn thận! Nó được thêm vào lời khuyên.
rahnema1

11

eval

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

Hãy thử trực tuyến!


Trong Matlab, các dấu ngoặc đơn không thể được bỏ qua:

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

9
Chỉ có trên PPCG là evalcâu trả lời :-)
Stewie Griffin

Bạn có muốn thêm điều này vào câu hỏi mẹo Octave không? forlặp bên trong một hàm ẩn danh bằng cách sử dụng evalđã lưu rất nhiều byte ở đó và có thể cũng có thể thực hiện điều đó trong nhiều thử thách khác ,,,
Stewie Griffin

Không chắc nó có bao giờ chơi gôn không, nhưng tôi cho rằng bạn có thể làm điều đó ngay cả khi không có chức năng ẩn danh: s='x([1 4])=x([4 1])';eval(s)- Tôi cho rằng điều này chủ yếu là thú vị nếu bạn đã thực hiện một chức năng để làm eval với ký tự tối thiểu.
Dennis Jaheruddin


2
Tôi nghĩ rằng câu trả lời này là câu trả lời duy nhất cả Octave và Matlab hợp lệ.
Batman

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.