คุณมีคำแนะนำทั่วไปเกี่ยวกับการเล่นกอล์ฟใน MATLAB อย่างไร ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ MATLAB (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คุณมีคำแนะนำทั่วไปเกี่ยวกับการเล่นกอล์ฟใน MATLAB อย่างไร ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ MATLAB (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
สิ่งที่ต้องรู้ก่อนเริ่มเล่นกอล์ฟ:
ในการคำนวณ MATLAB ตัวละครจะทำงานเหมือนกับรหัส ascii
'abc' - 'a' % Returns: [0 1 2]
'123' - '0' % Returns: [1 2 3]
'“' == 8220 % Returns: 1 (logical)
'a':'e'==100 % Returns: [0 0 0 1 0] (logical)
การย่อชื่อคุณสมบัติ
ใน MATLAB สตริงที่ระบุคุณสมบัติสามารถทำให้สั้นลงได้หากไม่ทำให้เกิดความกำกวม
plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color (black)
นี้จริงชนะฉันท้าทาย :)
name, value
คู่ที่แสดงด้านบน (อย่าทำในสิ่งที่ชอบsort(rand(4,1),'descend')
)
conv(1:5,[1 1],'s')
แทนที่จะconv(1:5,[1 1],'same')
การหล่อเป็นถ่านสามารถทำได้โดยการต่อกับถ่าน:
x='a'+magic(5) % Array with character codes of several letters
char(x) % The standard way
['' x] % The compact way
แม้ว่ามันจะประหยัดเพียงตัวเดียว แต่ก็สามารถใช้งานได้บ่อย
สตริงเป็นเพียงเวกเตอร์แถวอักขระ ซึ่งหมายความว่าแทน
for i=numel(str)
a=str(i)
...
end
คุณสามารถเขียนได้
for(a=str)
...
end
ครั้งแรกที่ฉันใช้สิ่งนี้: /codegolf//a/58387/32352
ป.ร. ให้ไว้เป็นจำนวนเต็มบวกn
วิธีมาตรฐานในการสร้างn
-th รากของความสามัคคีเป็น
exp(2j*pi*(0:n-1)/n)
สิ่งนี้ทำให้รากเริ่มต้น1
และเคลื่อนที่ในทิศทางเชิงมุมเป็นบวก หากคำสั่งซื้อไม่สำคัญสิ่งนี้สามารถทำให้สั้นลงได้
exp(2j*pi*(1:n)/n)
เนื่องจากexp(2j*pi/4)
เท่ากับหน่วยจินตภาพ ( j
) จึงสามารถเขียนได้อย่างกระชับกว่านี้ (เคล็ดลับเนื่องจาก @flawr ):
j.^(4*(0:n-1)/n)
หรือ
j.^(4*(1:n)/n)
แต่การแปลงฟูริเยร์แบบแยกให้วิธีที่สั้นกว่า (ขอบคุณ @flawr สำหรับการลบวงเล็บที่ไม่จำเป็นสองอัน):
fft(1:n==n)
ซึ่งทำให้รากเริ่มต้น1
และเคลื่อนที่ไปในทิศทางที่เป็นบวก หรือ
fft(1:n==2)
ซึ่งเริ่มต้น1
และเคลื่อนที่ในทิศทางเชิงมุมเชิงลบ
fft(1:n==2)
nnz
บางครั้งคุณสามารถบันทึกไม่กี่ไบต์:
A
ลองนึกภาพคุณต้องการผลรวมของเมทริกซ์ลอจิคัล แทนsum(sum(A))
หรือsum(A(:))
คุณสามารถใช้nnz(a)
( ใช้โดยnnz
นัย(:)
)numel(x)
nnz(x)
สิ่งนี้ใช้ได้เช่นถ้าx
เป็นสตริงวนซ้ำในเวกเตอร์ในเมทริกซ์
เมื่อกำหนดชุดของเวกเตอร์เป็นเมทริกซ์คุณสามารถวนซ้ำมันผ่านทางลูปแบบเดียวได้
for v=M
disp(v);
end
ในขณะที่ "ตามธรรมเนียม" คุณอาจทำเช่นนั้น
for k=1:n
disp(M(:,k));
end
ฉันเพิ่งเรียนรู้เกี่ยวกับเคล็ดลับนี้จาก @Suever ในความท้าทายนี้เท่านั้น
ที่เกี่ยวข้อง แต่ไม่เหมือนกันเคล็ดลับสำหรับการคู่
ฟังก์ชั่นที่เป็นที่รู้จักและใช้กันน้อยของทั้ง MATLAB และ Octave คือฟังก์ชั่นบิวอินส่วนใหญ่สามารถเรียกได้โดยไม่มีวงเล็บ หากมีช่องว่างคุณต้องมีเครื่องหมายคำพูด สิ่งนี้สามารถใช้เพื่อบันทึกไบต์บ่อยครั้งเมื่อใช้disp
:
disp('Hello, World!')
disp 'Hello, World!'
ตัวอย่างอื่น ๆ ที่มีประโยชน์น้อย ได้แก่ :
nnz PPCG
ans = 4
size PPCG
ans = 1 4
str2num 12
ans = 12
ฉันใช้มันสองครั้งจริง ๆ ใน"คุณนับได้สูงแค่ไหน" -ท้าทาย:
strchr sssssssssssssst t
เทียบเท่ากับและผลตอบแทนstrchr('sssssssssssssst','t')
15
nnz nnnnnnnnnnnnnn
เทียบเท่ากับและผลตอบแทนnnz('nnnnnnnnnnnnnn')
14
สิ่งที่ชอบgt r s
ผลงานมากเกินไป (เทียบเท่าหรือ'r'>'s'
gt('r','s')
ในตัวones
และzeros
โดยทั่วไปจะเป็นการเสียพื้นที่ คุณสามารถบรรลุผลเดียวกันโดยเพียงแค่คูณอาร์เรย์ / เมทริกซ์ (จากขนาดที่ต้องการ) โดย 0 (จะได้รับการส่งออกของzeros
) และเพิ่ม 1 ones
ถ้าคุณต้องการส่งออกของ
d = rand(5,2);
%// Using zeros
z = zeros(size(d));
%// Not using zeros
z = d*0;
%// Using ones
o = ones(size(d));
%// Not using ones
o = 1+d*0
วิธีนี้ใช้ได้หากคุณต้องการสร้างคอลัมน์หรือเวกเตอร์แถวของศูนย์หรือขนาดที่มีขนาดหนึ่งมิติของเมทริกซ์
p = rand(5,2);
z = zeros(size(p,1), 1);
z = 0*p(:,1);
o = ones(size(p, 1), 1);
o = 1+0*p(:,1);
หากคุณต้องการสร้างเมทริกซ์ที่มีขนาดเฉพาะคุณสามารถใช้zeros
แต่คุณสามารถกำหนดองค์ประกอบสุดท้ายให้เป็น 0 และให้ MATLAB เติมส่วนที่เหลือ
%// This
z = zeros(2,3);
%// vs. This
z(2,3) = 0;
~(1:n)
กับเวกเตอร์ศูนย์ 1-d
นี่อาจเป็นหัวข้อเฉพาะ แต่เห็นได้ชัดว่าบางคนชอบใช้การโน้มน้าวใจกับสิ่งต่าง ๆ ที่นี่ [ต้องการอ้างอิง]
ในการติดตามเมล็ด 2 มิติมักจำเป็นต้องใช้:
0 1 0
1 1 1
0 1 0
สามารถทำได้โดยใช้
v=[1,2,1];v'*v>1 %logical
v=[1,0,1];1-v'*v %as numbers
ซึ่งสั้นกว่า
[0,1,0;1,1,1;0,1,0]
เคอร์เนลอื่นมักใช้คือ
0 1 0
1 0 1
0 1 0
ซึ่งสามารถย่อให้เล็กลงโดยใช้
v=[1,-1,1];v'*v<0 % logical
[0,1,0;1,0,1;0,1,0] % naive verison
toeplitz([0 1 0])
ฉันมักจะพบว่าตัวเองกำลังใช้งานอยู่meshgrid
หรือndgrid
สมมติว่าเราต้องการคำนวณภาพแมนเดอร์บอตแล้วเราเริ่มต้นเช่น
[x,y]=meshgrid(-2:1e-2:1,-1:1e-2,1)
ทีนี้สำหรับชุดแมนเดอร์บอตเราต้องการเมทริกซ์อีกc
ขนาดx
และy
เริ่มต้นด้วยศูนย์ สิ่งนี้สามารถทำได้โดยการเขียน:
c=x*0;
คุณยังสามารถเริ่มต้นเป็นค่าอื่นได้:
c=x*0+3;
แต่คุณสามารถบันทึกไบต์ได้จริงโดยเพียงแค่เพิ่มมิติอื่นในmeshgrid/ndgrid
:
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 0); %or for the value 3
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 3);
และคุณสามารถทำได้บ่อยเท่าที่คุณต้องการ:
[x,y,c1,c2,c3,c4,c5]=meshgrid(-2:1e-2:1,-1:1e_2,1, 1,pi,exp(3),1e5,-3i)
x=-2:1d-2:1;y=x'
ในหลายกรณีตัวอย่างแรกจะถูกแทนที่ด้วย
สำหรับการสรุปฟังก์ชั่น f (x_n) โดยที่ n เป็นเวกเตอร์ของจำนวนเต็มต่อเนื่อง feval จะได้รับคำแนะนำมากกว่า symsum
Syms x;symsum(f(x),x,1,n);
Sum(feval(@(x)f(x),1:n));
ขอให้สังเกตว่าการดำเนินงานระดับประถมศึกษา.*
และ./
มีความจำเป็นแทนการดำเนินงานแบบไบนารี*
และ/
ถ้าฟังก์ชั่นนั้นสามารถเขียนได้อย่างไร้เดียงสาก็ไม่มีใครที่เหมาะสม
ตัวอย่างเช่นถ้าฟังก์ชั่นที่log
คุณสามารถทำได้: sum(log(1:n))
ซึ่งหมายถึง:
Sum(f(1:n));
สำหรับฟังก์ชั่นที่ค่อนข้างซับซ้อนอย่างที่log(n)/x^n
คุณสามารถทำได้:
Sum(log(1:n)./5.^(1:n))
และสั้นลงในบางกรณีเมื่อฟังก์ชันยาวกว่าf(x)=e^x+sin(x)*log(x)/x
...
Sum(feval(@(y)e.^(y)+sin(y).*log(y)./y,1:n))
ที่สั้นกว่าอย่างน่าทึ่ง sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
หมายเหตุ:เคล็ดลับนี้สามารถนำมาใช้สำหรับผู้ประกอบการอื่น ๆ ที่รวมprod
หรือmean