เคล็ดลับสำหรับการเล่นกอล์ฟใน MATLAB


14

คุณมีคำแนะนำทั่วไปเกี่ยวกับการเล่นกอล์ฟใน MATLAB อย่างไร ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ MATLAB (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ



คำตอบ:


10

สิ่งที่ต้องรู้ก่อนเริ่มเล่นกอล์ฟ:

ในการคำนวณ 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)

9

การย่อชื่อคุณสมบัติ

ใน MATLAB สตริงที่ระบุคุณสมบัติสามารถทำให้สั้นลงได้หากไม่ทำให้เกิดความกำกวม

plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color  (black)

นี้จริงชนะฉันท้าทาย :)


2
ดีมาก แต่คำตอบนั้นถูกต้องฉันต้องการเน้นว่านี่ใช้กับชื่อของname, valueคู่ที่แสดงด้านบน (อย่าทำในสิ่งที่ชอบsort(rand(4,1),'descend'))
Dennis Jaheruddin

1
มันไม่นำไปใช้กับบางส่วนของสิ่งเหล่านั้นด้วยเช่นconv(1:5,[1 1],'s')แทนที่จะconv(1:5,[1 1],'same')
หลุยส์ Mendo

6

การหล่อเป็นถ่านสามารถทำได้โดยการต่อกับถ่าน:

x='a'+magic(5) % Array with character codes of several letters

char(x) % The standard way
['' x] % The compact way

แม้ว่ามันจะประหยัดเพียงตัวเดียว แต่ก็สามารถใช้งานได้บ่อย


5

สตริงเป็นเพียงเวกเตอร์แถวอักขระ ซึ่งหมายความว่าแทน

for i=numel(str)
    a=str(i)
    ...
end

คุณสามารถเขียนได้

for(a=str)
    ...
end

ครั้งแรกที่ฉันใช้สิ่งนี้: /codegolf//a/58387/32352


4

รากของความสามัคคีผ่านการแปลงฟูริเยร์แบบแยก

ป.ร. ให้ไว้เป็นจำนวนเต็มบวก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)
flawr

@ flawr ฉันไม่เคยรู้กฎมาก่อน ... ขอบคุณ!
Luis Mendo

3

nnz บางครั้งคุณสามารถบันทึกไม่กี่ไบต์:

  • Aลองนึกภาพคุณต้องการผลรวมของเมทริกซ์ลอจิคัล แทนsum(sum(A))หรือsum(A(:))คุณสามารถใช้nnz(a)( ใช้โดยnnzนัย(:))
  • หากคุณต้องการที่จะทราบจำนวนขององค์ประกอบของอาร์เรย์และคุณสามารถมั่นใจได้ว่าจะไม่มีเลขศูนย์แทนคุณสามารถใช้numel(x) nnz(x)สิ่งนี้ใช้ได้เช่นถ้าxเป็นสตริง

3

วนซ้ำในเวกเตอร์ในเมทริกซ์

เมื่อกำหนดชุดของเวกเตอร์เป็นเมทริกซ์คุณสามารถวนซ้ำมันผ่านทางลูปแบบเดียวได้

for v=M
    disp(v);
end

ในขณะที่ "ตามธรรมเนียม" คุณอาจทำเช่นนั้น

for k=1:n
    disp(M(:,k));
end

ฉันเพิ่งเรียนรู้เกี่ยวกับเคล็ดลับนี้จาก @Suever ในความท้าทายนี้เท่านั้น


3

ที่เกี่ยวข้อง แต่ไม่เหมือนกันเคล็ดลับสำหรับการคู่

ฟังก์ชั่นที่เป็นที่รู้จักและใช้กันน้อยของทั้ง 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')


2

ในตัว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;

2
ฉันชอบที่จะใช้~(1:n)กับเวกเตอร์ศูนย์ 1-d
sintax

2

เมล็ดข้าวเหนียว 2D

นี่อาจเป็นหัวข้อเฉพาะ แต่เห็นได้ชัดว่าบางคนชอบใช้การโน้มน้าวใจกับสิ่งต่าง ๆ ที่นี่ [ต้องการอ้างอิง]

ในการติดตามเมล็ด 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])
Luis Mendo

2

ฉันมักจะพบว่าตัวเองกำลังใช้งานอยู่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'ในหลายกรณีตัวอย่างแรกจะถูกแทนที่ด้วย
ข้อบกพร่อง

0

การรวมลำดับของฟังก์ชัน

  • สำหรับการสรุปฟังก์ชั่น 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


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