คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟในอ็อกเทฟ ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหาเกี่ยวกับการเขียนโค้ดกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Octave (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟในอ็อกเทฟ ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหาเกี่ยวกับการเขียนโค้ดกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Octave (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
a
เป็นอิสระจากค่าศูนย์โดยใช้nnz(a)
เครื่องคุณ 2 numel(a)
เมื่อเทียบกับตัวอักษรa(a==0)
a(find(a==0))
~t
จะสั้นกว่าt==0
และแม้จะสั้นกว่า~~t
t!=0
0*(1:n)
สั้นกว่า zeros(1,n)
||
และ&&
ไม่เหมือนกับโอเปอเรเตอร์อื่น ๆ ที่ทำให้เกิดผลลัพธ์เมื่ออาร์กิวเมนต์แรกเป็นสเกลาร์ สำหรับการฝึกอบรมเพียงการฝึกอบรมไม่ว่างเปล่าโดยไม่ต้ององค์ประกอบเท่ากับศูนย์มีค่าตรรกะของความจริงดังนั้นเราสามารถทำ0||m
แทนall(all(m))
เมทริกซ์ใด ๆ ก็ได้
ลองด้วย0||[1 1;1 0]
และ0||[1 1;1 1]
โน้มน้าวใจตัวเอง
เมื่อคุณใช้บิวด์อินหลาย ๆ ครั้งให้ทำหน้าที่จัดการกับอักขระสำรองเช่น f=@find
. สำหรับชื่อฟังก์ชั่นแบบสั้นที่มีอย่างน้อย 3 เหตุการณ์ให้เหตุผลนี้สำหรับชื่อยาว - แม้จะมีสองเหตุการณ์
เมื่อมีฟังก์ชั่นเป็นคำเดียวชอบf=@(n)dosomething(n)
สัญกรณ์การfunction r=f(n)r=dosomething(n);end
อย่างใดอย่างหนึ่ง
น่าเสียดายที่ตัวแปรโกลบอลต้องถูกประกาศทั้งในขอบเขตโกลบอลและในแต่ละฟังก์ชันที่ใช้มัน แต่มีข้อยกเว้นคือ@(n)...
ฟังก์ชั่นที่ไม่ระบุชื่อ"เห็น" ตัวแปรทั้งหมดจากขอบเขตที่พวกเขาถูกเรียกจาก
มันเป็นไปได้ที่จะทำแทนf(a=0,b=0)
a=0;b=0;f(a,b)
นี่ดูเหมือนว่าจะไม่มีคุณสมบัติ แต่ลำดับของการประเมินคือจากซ้ายไปขวา (ตรวจสอบที่ v. 3.8.1) คุณสามารถทำzeros(a=n,b=a*a)
ทั้งสองอย่างเพื่อสร้างเมทริกซ์ anxn ^ 2 และเก็บไว้เป็นจำนวนแถวและคอลัมน์ในa
และb
ตัวแปร
ตารางลำดับความสำคัญของโอเปอเรเตอร์คือเพื่อนของคุณ ไม่ได้ทำb=(a==0)
มาตั้งแต่b=a==0
เป็นเหมือนกัน
ฉันจำไม่ได้ว่าสิ่งที่ท้าทายฉันเห็นมันมีคนใช้ (โปรดบอกเรา =) แต่ฉันพบว่านี่เป็นเคล็ดลับเรียบร้อย:
โดยปกติถ้าคุณเพิ่มเมทริกซ์คุณต้องมีขนาดเท่ากัน แต่สำหรับเมทริกซ์หนึ่งมิติ (1xn และ nx1) จะมีทางลัด (ซึ่งไม่ทำงานใน Matlab):
z = (1:5)+(6:10)';
สร้างผลเช่นเดียวกับ
[x,y]=meshgrid(1:5,6:10);
z = x+y;
จากนั้นบางสิ่งที่ pawel.boczarski ได้กล่าวถึงแล้ว: ใน Octave คุณสามารถ (ในขณะที่คุณไม่สามารถใช้ Matlab) กำหนดตัวแปรเสริมภายในฟังก์ชั่นการจัดการและการกำหนดตัวแปรเองนั้นมีค่าของการมอบหมายเพื่อให้คุณสามารถย่อรหัสได้ ตัวอย่าง แต่คุณจะได้เคล็ดลับ):
f=@(n)(z=n+1)*z; %returns (n+1)^2
เคล็ดลับอื่น (เช่นที่ใช้ใน Matlab) คือการใช้สายอักขระในการจัดเก็บหมายเลข (hardcoded) (เคล็ดลับที่ประณีตนี้ถูกขโมยจาก feersum)คุณเพียงต้องการบางสิ่งที่ตีความสตริงเป็นตัวเลขซึ่งเป็นเรื่องง่ายเช่นการเพิ่มศูนย์:
a = 'abc';
a+0 %returns
[97 98 99]
หรือ
sum('abc') == 294
a+0
a+'0'
อื่น ๆ กว่าที่เคล็ดลับที่มีความสุข =)
+= -= /=
ผู้ประกอบการ ฯลฯ ในรายการของคุณด้านล่าง?
+a
สั้นกว่าa+0
อ็อกเทฟสามารถรับอาร์กิวเมนต์เริ่มต้นเพื่อให้สามารถประเมินนิพจน์ในรายการอาร์กิวเมนต์
คุณลักษณะนี้มีประโยชน์เมื่อเราต้องการคำนวณนิพจน์และใช้หลายครั้ง:
f = @(x,a=sort(x))a(a>.5);
กรณีใช้งานอย่างหนึ่งคือเมื่อเราใช้การกำหนดดัชนีเพื่อแก้ไขส่วนของอาเรย์และเราต้องการใช้อาเรย์:
a=[1 2 3 4]
a(2)=5;
แต่การแสดงออก(a(2)=5)
กลับa(2)
มาหรือการแสดงออก(a([1 3])=4)
กลับอาร์เรย์สององค์ประกอบ ไม่ส่งคืนอาร์เรย์ทั้งหมด เราสามารถใช้รายการอาร์กิวเมนต์:
f=@(a=[1 2 3 4],b=a(2)=5)a;
ที่นี่ผลลัพธ์ของการกำหนดดัชนีจะถูกเก็บไว้ในตัวแปรจำลองb
และฟังก์ชันส่งคืนอาร์เรย์
- ในระดับแปดเสียงมันเป็นไปได้ที่จะใช้การจัดทำดัชนีในการแสดงออกชั่วคราวคุณสมบัติที่ต้องห้ามใน MATLAB และคุณลักษณะนี้มีประโยชน์มากสำหรับการเล่นกอล์ฟ ตัวอย่าง:
ระดับแปดเสียง: [1 23 4 5 7](3:4)
และระดับเทียบเท่า MATLAB: ระดับa=[1 23 4 5 7];a(3:4)
แปดเสียง: hilb(4)(4:5,4:5)
และระดับเทียบเท่า MATLAB: ระดับh=hilb(4);h(4:5,4:5)
แปดเสียง: {1,4,{4 5 6},[7 ;3]}{3}
และระดับเทียบเท่า MATLAB: ระดับa={1,4,{4 5 6},[7 ;3]};a{3}
แปดเสียง: num2cell([1 2 3 4]){:}
สำหรับการสร้างรายการคั่นด้วยเครื่องหมายจุลภาค
คู่:a'(:)'
-S บางครั้งในฟังก์ชั่นที่ไม่ระบุชื่อเป็นฟังก์ชั่นปกติเราต้องประเมินหลายนิพจน์ที่มีการกำหนดวิธีการหนึ่งคือการที่เราสามารถวางแต่ละการแสดงออกในเซลล์ (เนื่องจากเซลล์สามารถมีวัตถุหลายประเภท) และเมื่อเราต้องการค่า ในแต่ละนิพจน์เราสามารถใช้การจัดทำดัชนีเพื่อแยกองค์ประกอบนั้น
{1,4,{4 5 6},[7 ;3]}{3}
หรือ
{a=1,b=4,c={4 5 6},[b ;3]}{4}
ข้ามอัฒภาค!
ฉันจะใช้คำตอบนี้เพื่ออธิบายประเด็น
รหัสเดิมคือ:
function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end
หลังจากลบเครื่องหมายอัฒภาคอาจลดลงเป็นดังต่อไปนี้บันทึกสามไบต์:
function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end
สามารถใช้สถานที่นี้ได้ไม่กี่แห่งและสิ่งที่คุณไม่ได้ลองเพราะดูเหมือนว่าข้อผิดพลาดทางไวยากรณ์มักจะใช้งานได้
อันนี้ง่าย แต่มีประโยชน์
ใน Octave แต่ไม่ใช่ MATLAB คุณสามารถทำได้ใน C ++:
x = 0 -> x = 0
x++ -> ans = 0
x -> x = 1
++x -> ans = 2
x -> x = 2
อีกแบบง่าย ๆ แต่มีประโยชน์ (ไม่สามารถทำได้ใน MATLAB):
กำหนดค่าเดียวกันให้กับตัวแปรหลายตัว:
a=b=c=0;
ใช้eval
!
แรงบันดาลใจจากคำตอบของหลุยส์ Mendo ของที่นี่
input('')
ฟังก์ชั่นที่ไม่ระบุชื่อที่อยู่ในกรณีส่วนใหญ่ที่สั้นกว่าการสร้างสคริปต์ที่ต้องการหนึ่งหรือมากกว่าโทรไปยัง ข้อเสียคือลูปและการปรับเปลี่ยนตัวแปร (เช่นการสลับสององค์ประกอบในเมทริกซ์) เป็นไปไม่ได้ยุ่งยาก
ด้วยeval
คุณสามารถดึงอินพุตเหมือนกับฟังก์ชันนิรนามทั่วไปและรันสคริปต์เช่นเดียวกับสคริปต์ปกติ:
พิจารณาสิ่งนี้ :
c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A
เปรียบเทียบกับสิ่งนี้:
@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')
รหัสเหมือนกัน แต่ส่วนอินพุตสั้นกว่ามาก
สิ่งนี้สามารถใช้เพื่อแก้ไขตัวแปรอินพุตเช่นนี้ (เครดิตสำหรับLuis Mendoสำหรับสิ่งนี้!):
f(x)eval('x([1,4])=x([4,1])`;
ใช้rows(a)
แทนsize(a,1)
ที่เกี่ยวข้อง แต่ไม่เหมือนกันเคล็ดลับสำหรับการ MATLAB
คุณสมบัติที่เป็นที่รู้จักและใช้เพียงเล็กน้อยของอ็อกเทฟคือฟังก์ชั่นบิวอินในตัวส่วนใหญ่สามารถเรียกได้โดยไม่ต้องใช้วงเล็บซึ่งในกรณีนี้พวกเขาจะจัดการกับสิ่งต่าง ๆ ที่ตามมาเป็นสตริง (ตราบเท่าที่ไม่มีช่องว่าง) หากมีช่องว่างคุณต้องมีเครื่องหมายคำพูด disp
นี้สามารถนำมาใช้บ่อยในการบันทึกไบต์หรือสองเมื่อใช้ งานทั้งหมดต่อไปนี้และให้ผลลัพธ์เดียวกัน:
disp('Hello')
disp Hello
disp"Hello"
หากคุณมีช่องว่างคุณต้องมีเครื่องหมายคำพูด:
disp('Hello, World!')
disp"Hello, World!"
ตัวอย่างอื่น ๆ ที่มีประโยชน์น้อย ได้แก่ :
nnz PPCG
ans = 4
size PPCG
ans = 1 4
str2num 12
ans = 12