Lời khuyên cho việc chơi golf ở Octave


18

Bạn có lời khuyên chung nào cho việc chơi golf ở Octave? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với Octave (ví dụ: "xóa bình luận" không phải là một câu trả lời). Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.


2
Liên quan, nhưng không phải là một bản sao: Mẹo chơi gôn trong MATLAB
Dennis Jaheruddin

Câu trả lời:


9
  1. Khi bạn biết, đó alà giá trị 0, sử dụng cho nnz(a)bạn 2 ký tự so vớinumel(a) .
  2. Thích a(a==0)đến a(find(a==0)).
  3. ~tngắn hơn t==0, và thậm chí ~~tngắn hơn t!=0.
  4. 0*(1:n) ngắn hơn zeros(1,n)
  5. Nói chung, ||&&, không giống như nhiều toán tử khác, vô hướng kết quả khi đối số đầu tiên là vô hướng. Đối với ma trận, chỉ các ma trận không trống không có các phần tử bằng 0 mới có giá trị logic là true .

Do đó, chúng ta có thể làm 0||mthay vì all(all(m))cho bất kỳ ma trận.

Hãy thử với 0||[1 1;1 0]0||[1 1;1 1]để thuyết phục chính mình.

  1. Khi bạn đang sử dụng tích hợp nhiều lần, hãy thực hiện một hàm xử lý các ký tự dự phòng, vd. f=@find. Đối với tên hàm ngắn, ít nhất 3 lần xuất hiện biện minh cho điều này, đối với các tên dài - ngay cả với hai lần xuất hiện.

  2. Khi một hàm là một câu lệnh đơn, thích f=@(n)dosomething(n)ký hiệu hơn function r=f(n)r=dosomething(n);endmột.

  3. Thật không may, các biến toàn cục phải được khai báo cả trong phạm vi toàn cầu và trong từng hàm sử dụng chúng. Nhưng có một ngoại lệ: các @(n)...hàm ẩn danh "nhìn thấy" tất cả các biến từ phạm vi mà chúng được gọi từ đó.

  4. Nó có thể làm f(a=0,b=0)thay vì a=0;b=0;f(a,b).

  5. Đây là tính năng không có giấy tờ, nhưng thứ tự đánh giá là từ trái sang phải (được kiểm tra tại câu 3.8.1), bạn có thể thực hiện zeros(a=n,b=a*a)để tạo cả ma trận ^ 2 và lưu trữ hàng và số cột trong đó abcác biến.

  6. Bảng ưu tiên toán tử là bạn của bạn. Đừng làm b=(a==0)từ b=a==0là như nhau.


7

Tôi không nhớ trong thử thách nào tôi đã thấy ai đó sử dụng (xin vui lòng cho chúng tôi biết =), nhưng tôi thấy đây là một mẹo gọn gàng:

Thông thường nếu bạn thêm ma trận, bạn phải có cùng kích thước, nhưng đối với ma trận một chiều (1xn và nx1) có một phím tắt (không hoạt động trong Matlab):

z = (1:5)+(6:10)';

tạo ra hiệu ứng tương tự như

[x,y]=meshgrid(1:5,6:10);
z = x+y;

Sau đó, một cái gì đó mà pawel.boczarski đã đề cập: Trong Octave bạn có thể (trong khi bạn không thể trong Matlab) xác định các biến phụ trợ trong các hàm điều khiển, và chính phép gán biến có giá trị của phép gán để bạn thực sự có thể rút ngắn mã (đây cũng là một cách vô dụng ví dụ nhưng bạn sẽ nhận được mẹo):

f=@(n)(z=n+1)*z; %returns (n+1)^2

Sau đó, một mẹo khác (cũng có thể áp dụng trong Matlab) là lạm dụng các chuỗi để lưu trữ số (mã hóa cứng) (thủ thuật gọn gàng này bị đánh cắp từ frageum) , bạn chỉ cần một cái gì đó diễn giải chuỗi là số, dễ như ví dụ thêm số 0:

a = 'abc';
a+0 %returns
[97 98 99]

Hoặc là

sum('abc') == 294

Tôi tin rằng nó được cho là a+0, không phải a+'0'. Ngoài ra, các mẹo rất hay =)
Stewie Griffin

Phải, cảm ơn! PS: Bạn có thể thêm các += -= /=toán tử vv trong danh sách của bạn dưới đây không?
flawr

1
+angắn hơna+0
Luis Mendo

7

Sử dụng danh sách đối số:

Octave có khả năng nhận được các đối số mặc định để các biểu thức có thể được đánh giá trong danh sách đối số.

Tính năng này hữu ích khi chúng ta muốn tính toán một biểu thức và sử dụng nó nhiều lần:

f = @(x,a=sort(x))a(a>.5);

Một trường hợp sử dụng là khi chúng ta sử dụng một phép gán được lập chỉ mục để sửa đổi một phần của mảng và chúng ta muốn sử dụng mảng:

a=[1 2 3 4]
a(2)=5;

Nhưng biểu thức (a(2)=5)trả về a(2)hoặc biểu thức (a([1 3])=4)trả về một mảng hai phần tử. Không trả về toàn bộ mảng. Chúng ta có thể sử dụng danh sách đối số:

f=@(a=[1 2 3 4],b=a(2)=5)a;

Ở đây, kết quả của phép gán được lập chỉ mục được lưu trữ vào một biến giả bvà hàm trả về mảng.


6

-Trong Octave, có thể áp dụng lập chỉ mục trên biểu thức tạm thời, một tính năng bị cấm trong MATLAB và tính năng này rất hữu ích cho việc chơi gôn. thí dụ:

Octave: [1 23 4 5 7](3:4) và tương đương MATLAB của nó: a=[1 23 4 5 7];a(3:4)
Octave: hilb(4)(4:5,4:5) và tương đương MATLAB của nó: h=hilb(4);h(4:5,4:5)
Octave: {1,4,{4 5 6},[7 ;3]}{3}và tương đương MATLAB của nó:a={1,4,{4 5 6},[7 ;3]};a{3}
Octave: num2cell([1 2 3 4]){:}để tạo danh sách được phân tách bằng dấu phẩy
Octave:a'(:)'

-Những trường hợp trong một hàm ẩn danh như một hàm bình thường, chúng tôi yêu cầu đánh giá nhiều biểu thức, bao gồm phép gán, Một cách tiếp cận là chúng ta có thể đặt từng biểu thức trong một ô (vì ô có thể chứa đối tượng có nhiều loại) và khi chúng ta cần giá trị của mỗi biểu thức chúng ta có thể sử dụng lập chỉ mục để trích xuất phần tử đó.

{1,4,{4 5 6},[7 ;3]}{3}
hoặc là

{a=1,b=4,c={4 5 6},[b ;3]}{4}


@StewieGriffin Mẹo hay! Trả lời cập nhật!
rahnema1

5

Bỏ qua dấu chấm phẩy!

Tôi sẽ sử dụng câu trả lời này để minh họa điểm.

Mã ban đầu là:

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

Sau khi xóa dấu chấm phẩy, nó có thể được giảm xuống như sau, tiết kiệm ba byte:

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

Điều này có thể được sử dụng khá nhiều nơi và những thứ bạn thậm chí không thử vì có vẻ như lỗi cú pháp thường hoạt động.


1
những thứ bạn thậm chí không thử vì có vẻ như lỗi cú pháp thường hoạt động Octave một cách ngắn gọn
Sanchise

2

Đây là một đơn giản, nhưng hữu ích.

Trong Octave, nhưng không phải MATLAB, bạn có thể làm như trong C ++:

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2

2

Một cách đơn giản nhưng hữu ích khác (không thể có trong MATLAB):

Gán cùng một giá trị cho một số biến:

a=b=c=0;

2

Sử dụng eval!

Lấy cảm hứng từ câu trả lời của Luis Mendo ở đây .


Các hàm ẩn danh trong hầu hết các trường hợp ngắn hơn so với việc tạo một tập lệnh cần một hoặc nhiều lệnh gọi đến input(''). Nhược điểm là các vòng lặp và sửa đổi biến (chẳng hạn như hoán đổi hai phần tử trong ma trận) là không thể rườm rà.

Với eval, bạn có thể tìm nạp đầu vào như bạn làm với một hàm ẩn danh bình thường và chạy tập lệnh như bạn làm với một tập lệnh thông thường:

Hãy xem xét điều này :

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

So với điều này:

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

Mã giống hệt nhau, nhưng phần đầu vào ngắn hơn nhiều.


Điều này cũng có thể được sử dụng để sửa đổi các biến đầu vào, như thế này (tín dụng cho Luis Mendo cho điều này!):

f(x)eval('x([1,4])=x([4,1])`;

3
Mã giống hệt Chỉ xấu hơn, chậm hơn và ít đọc hơn. Bạn có thể yêu cầu gì hơn nữa? :-D
Luis Mendo


1

Các mẹo liên quan, nhưng không giống nhau cho MATLAB .

Một tính năng ít được biết đến và ít được sử dụng của Octave là hầu hết các hàm dựng sẵn có thể được gọi mà không có dấu ngoặc đơn, trong trường hợp đó, chúng sẽ coi bất cứ thứ gì theo chuỗi đó (miễn là nó không chứa dấu cách). Nếu nó chứa khoảng trắng bạn cần dấu ngoặc kép. Điều này thường có thể được sử dụng để lưu một hoặc hai byte khi sử dụng disp. Tất cả các công việc sau đây, và cho kết quả tương tự:

disp('Hello')
disp Hello
disp"Hello"

Nếu bạn có khoảng trắng, thì bạn phải có dấu ngoặc kép:

disp('Hello, World!')
disp"Hello, World!"

Các ví dụ khác, ít hữu ích hơn bao gồm:

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
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.