วิธีการสลับองค์ประกอบในเวกเตอร์โดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อใน Octave?


15

การสลับองค์ประกอบสองอย่างในเวกเตอร์ / เมทริกซ์นั้นง่ายมากใน Octave:

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

น่าเสียดายที่ฉันยังไม่พบวิธีการทำสิ่งนี้ภายในฟังก์ชั่นที่ไม่ระบุชื่อ ในขณะที่ฟังก์ชั่นด้านล่างนั้นถูกต้องตามหลักไวยากรณ์ แต่จะให้องค์ประกอบสองอย่างที่เปลี่ยนกลับไม่ใช่ทั้งหมดxเวกเตอร์ :

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

มีวิธีการที่จะบรรลุพฤติกรรมที่ต้องการโดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อในลักษณะที่เป็นกอล์ฟหรือไม่? สามารถสลับหลายองค์ประกอบด้วยวิธีนี้โดยใช้ฟังก์ชันที่ไม่ระบุชื่อได้หรือไม่?

ฉันสามารถสร้างเวกเตอร์การจัดทำดัชนี: f=@(x)x([4,2,3,1,5])แต่การสร้างเวกเตอร์ดังกล่าวแบบไดนามิกนั้นอาจใช้เวลามากเช่นกัน


โพสต์เมตาที่เกี่ยวข้อง
Stewie Griffin

คำตอบ:


21

รายการอาร์กิวเมนต์

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

ลองออนไลน์!


5
รอสิ่งที่ ? ฉันไม่เคยรู้เลยว่าเป็นไปได้ใน Octave นี่เป็นการเปิดเทคนิคใหม่มากมาย ....
Sanchises

4
อะไรใน ...
Stewie Griffin

1
กรุณาโพสต์สิ่งนี้ในเคล็ดลับสำหรับคำถามระดับแปดเสียง! ด้วยเทคนิคนี้คุณสามารถทำทุกอย่างในรายการอาร์กิวเมนต์ได้ดังนั้นคุณไม่จำเป็นต้องเลือกระหว่างฟังก์ชั่น 'เต็ม' และไม่ระบุชื่ออีกครั้ง ฉันตกใจ
Sanchises

3
น่าอัศจรรย์ BTW คุณสามารถลบรอบสุดท้าย;เพื่อการนับจำนวนไบต์
Luis Mendo

ขอบคุณทุกคน @ Sanchises ดูเหมือนว่าอ็อกเทฟเป็นภาษาที่น่าตกใจ ระวัง! มันถูกเพิ่มเข้าไปในเคล็ดลับ
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

คุณต้องการที่จะเพิ่มนี้ไปที่คำถามเคล็ดลับคู่? forวนซ้ำภายในฟังก์ชันที่ไม่ระบุชื่อโดยใช้evalจำนวนไบต์ที่บันทึกไว้และอาจทำกับความท้าทายอื่น ๆ ได้เช่นกัน
Stewie Griffin

ไม่แน่ใจว่าเป็นนักกอล์ฟหรือไม่ แต่ฉันคิดว่าคุณสามารถทำได้แม้ว่าจะไม่มีฟังก์ชั่นนิรนาม: s='x([1 4])=x([4 1])';eval(s)- ฉันคิดว่านี่น่าสนใจเป็นส่วนใหญ่
Dennis Jaheruddin


2
ฉันคิดว่าคำตอบนี้เป็นคำตอบเดียวเท่านั้นที่อยู่ทั้งคู่ที่ถูกต้องและ Matlab
แบทแมน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.