Apa tips umum yang Anda miliki untuk bermain golf di MATLAB? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk MATLAB (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
14
Jawaban:
Sesuatu yang harus diketahui sebelum mulai bermain golf:
Dalam perhitungan MATLAB karakter berperilaku sama dengan kode ascii-nya.
sumber
Menyingkat nama properti
Dalam MATLAB, properti pengenal string dapat dipersingkat selama tidak menghasilkan ambiguitas.
Ini benar-benar memenangkan tantangan bagi saya :)
sumber
name, value
pasangan seperti yang ditunjukkan di atas. (Jadi tidak untuk hal-hal sepertisort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
bukannyaconv(1:5,[1 1],'same')
Casting sebagai char dapat dilakukan dengan penggabungan dengan char:
Meskipun hanya menghemat satu char, ini bisa digunakan cukup sering.
sumber
String hanyalah vektor baris karakter. Ini berarti bahwa alih-alih
Anda cukup menulis
Pertama kali saya menggunakan ini: /codegolf//a/58387/32352
sumber
Akar persatuan melalui transformasi Fourier diskrit
Diberikan bilangan bulat positif
n
, cara standar untuk menghasilkan akarn
ke - ke -satu adalahIni memberikan akar mulai
1
dan bergerak ke arah sudut positif. Jika pesanan tidak masalah, ini dapat dipersingkat menjadiKarena
exp(2j*pi/4)
sama dengan unit imajiner (j
), ini dapat ditulis lebih kompak sebagai berikut (trik karena @ flawr ):atau
Tetapi transformasi Fourier diskrit menyediakan cara yang lebih pendek (terima kasih kepada @ flawr karena menghapus dua tanda kurung yang tidak perlu):
yang memberikan akar mulai
1
dan bergerak ke arah sudut positif; atauyang dimulai pada
1
dan bergerak ke arah sudut negatif.Coba semua hal di atas di sini .
sumber
fft(1:n==2)
nnz
terkadang dapat menghemat beberapa byte:A
. Alih-alihsum(sum(A))
atausum(A(:))
, Anda dapat menggunakannnz(a)
(nnz
berlaku secara tidak jelas(:)
).numel(x)
Anda dapat menggunakannnz(x)
. Ini berlaku misalnya jikax
adalah string.sumber
Iterasi atas vektor dalam matriks.
Diberikan satu set vektor sebagai matriks, Anda sebenarnya dapat beralih atas mereka melalui satu untuk loop seperti
sementara "secara tradisional" Anda mungkin akan melakukannya seperti
Saya hanya belajar tentang trik ini sekarang dari @Suever dalam tantangan ini .
sumber
Terkait, tetapi bukan tip yang identik untuk Oktaf .
Fitur yang sedikit diketahui dan sedikit digunakan dari MATLAB dan Oktaf adalah bahwa sebagian besar fungsi builtin dapat dipanggil tanpa tanda kurung, dalam hal ini mereka akan memperlakukan apapun yang mengikutinya sebagai string (selama tidak mengandung spasi). Jika berisi spasi, Anda perlu tanda kutip. Ini sering dapat digunakan untuk menyimpan byte saat menggunakan
disp
:Contoh lain yang kurang bermanfaat termasuk:
Saya sebenarnya telah menggunakan ini dua kali dalam "Seberapa tinggi Anda bisa menghitung?" -tantangan:
setara dengan
strchr('sssssssssssssst','t')
dan kembali15
.setara dengan
nnz('nnnnnnnnnnnnnn')
dan kembali14
.Hal-hal seperti
gt r s
bekerja juga (setara dengan'r'>'s'
ataugt('r','s')
.sumber
Saya cukup sering menemukan diri saya menggunakan
meshgrid
ataundgrid
, katakanlah kita ingin menghitung gambar mandelbrot, lalu kita inisialisasi misalnyaSekarang untuk set mandelbrot kita perlu matriks lain
c
dari ukuranx
dany
tetapi diinisialisasi dengan nol. Ini dapat dengan mudah dilakukan dengan menulis:Anda juga dapat menginisialisasi ke nilai lain:
Tetapi Anda sebenarnya dapat menyimpan beberapa byte dengan hanya menambahkan dimensi lain di
meshgrid/ndgrid
:Dan Anda dapat melakukan ini sesering yang Anda inginkan:
sumber
Built-in
ones
danzeros
biasanya merupakan pemborosan ruang. Anda dapat mencapai hasil yang sama hanya dengan mengalikan array / matriks (dari ukuran yang diinginkan) dengan 0 (untuk mendapatkan outputzeros
) dan menambahkan 1 jika Anda menginginkan outputones
.Ini juga berfungsi jika Anda ingin membuat kolom atau vektor baris nol atau yang ukuran satu dimensi dari matriks.
Jika Anda ingin membuat matriks dengan ukuran tertentu yang bisa Anda gunakan
zeros
tetapi Anda juga bisa menetapkan elemen terakhir ke 0 dan minta MATLAB mengisi sisanya.sumber
~(1:n)
untuk vektor nol 1-d.Kernel Konvolusi 2D
Ini mungkin topik khusus, tetapi tampaknya beberapa orang suka menggunakan konvolusi untuk berbagai hal di sini. [rujukan?]
Dalam 2D, kernel berikut sering dibutuhkan:
Ini bisa dicapai dengan menggunakan
yang lebih pendek dari
Kernel lain yang sering digunakan adalah
yang dapat disingkat menggunakan
sumber
toeplitz([0 1 0])
Penjumlahan dari serangkaian fungsi
Untuk meringkas fungsi f (x_n) di mana n adalah vektor bilangan bulat berturut-turut, feval disarankan daripada symsum.
Perhatikan bahwa operasi dasar
.*
dan./
diperlukan bukan operasi biner berpasangan*
dan/
Jika fungsinya dapat ditulis secara naif, tidak ada seorang pun dari kedua cara terakhir yang cocok.
misalnya jika fungsinya
log
Anda cukup lakukan:,sum(log(1:n))
yang mewakili:untuk fungsi yang relatif canggih yang
log(n)/x^n
dapat Anda lakukan:dan bahkan lebih pendek dalam beberapa kasus ketika suatu fungsi lebih panjang
f(x)=e^x+sin(x)*log(x)/x
....itu jauh lebih pendek dari
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Catatan: Trik ini dapat diterapkan untuk operator inklusif lainnya sebagai
prod
ataumean
sumber