i
dan j
nama variabel yang sangat populer (lihat misalnya, pertanyaan ini dan yang satu ini ).
Misalnya, dalam loop:
for i=1:10,
% do something...
end
Sebagai indeks ke dalam matriks:
mat( i, j ) = 4;
Mengapa tidak harus mereka digunakan sebagai nama variabel di Matlab?
i
,j
,k
sebagai nama variabel loop generik.Jawaban:
Karena
i
danj
keduanya fungsi yang menunjukkan unit imajiner :Jadi variabel dipanggil
i
atauj
akan menimpanya, berpotensi memecahkan kode yang melakukan matematika kompleks.Solusi yang mungkin termasuk menggunakan
ii
danjj
sebagai variabel loop, atau menggunakan1i
kapan puni
diperlukan untuk mewakili unit imajiner.sumber
i
danj
nama variabel.for
loop 1 miliar kali tidak menunjukkan perbedaan statistik dalam hal waktu). Untuk semua yang kita tahu ada kode khusus untuk menangani hal ini dan menggunakan variabel selaini
danj
(dank
?) Sebenarnya sedikit lebih lambat. Dan perbedaan yang ada sangat kecil hingga tidak ada dalam kehidupan nyata. Tidak ada alasan untuk TIDAK menggunakani
danj
sebagai variabel biasa -mereka hanya harus digunakan dengan benar seperti fungsi Matlab lainnya.for
loop 1 miliar kali dan mencoba segala macam skema pengaturan waktu. Saya melihat pengguna SO baru diberi tahu bahwa kode yang benar-benar valid salah karena mereka menggunakani
danj
untuk mengulangi loop. Terus terang itu konyol dan orang-orang kehilangan poin yang lebih penting dari pertanyaan ini: itui
danj
bahkan tidak boleh digunakan untuk unit imajiner jika seseorang ingin menulis kode Matlab modern yang dapat dibaca.Merupakan praktik yang baik untuk menghindari
i
danj
variabel untuk mencegah kebingungan tentang mereka menjadi variabel atau unit imajiner.Namun secara pribadi, saya menggunakan
i
danj
sebagai variabel cukup sering sebagai indeks loop pendek. Untuk menghindari masalah dalam kode saya sendiri, saya mengikuti praktik baik lainnya mengenaii
danj
: jangan menggunakannya untuk menunjukkan angka imajiner. Bahkan, dokumentasi Matlab sendiri menyatakan :Jadi daripada menghindari dua nama variabel yang sangat umum digunakan karena potensi konflik, saya lebih eksplisit tentang angka imajiner. Itu juga membuat kode saya lebih jelas. Kapan saja saya melihat
1i
, saya tahu itu mewakilisqrt(-1)
karena tidak mungkin menjadi variabel.sumber
1i
. Namun, mengubah maknai
danj
dapat menyebabkan kesalahan sulit untuk debug seperti yang ini .i
danj
yang terbaik, tetapi menjelaskan bagaimana gaya pengkodean pribadi saya tidak mengikuti aturan itu.1i
dan bukani
untuk matematika yang rumit. Mari kita pikirkan angka imajiner sebagai1i
dan menganggapi
angka imajiner sebagai praktik buruk. Bukan sebaliknya. Menggunakani
,ii
,iii
adalah praktek yang umum di Matlab dan tidak ada masalah ketika orang-orang menempel1i
dan1j
untuk nomor kompleks. Matlab juga menghargai ini dan yang ini tidak menurunkan kinerja (sejauh yang saya uji) seperti yang dinyatakan dalam jawaban sebelumnya.Dalam versi lama MATLAB, dulu ada alasan bagus untuk menghindari penggunaan
i
danj
sebagai nama variabel - versi awal JIT MATLAB tidak cukup pintar untuk mengatakan apakah Anda menggunakannya sebagai variabel atau sebagai unit imajiner, dan karena itu akan matikan banyak kemungkinan optimasi.Karenanya, kode Anda akan menjadi lebih lambat hanya dengan kehadiran
i
danj
sebagai variabel, dan akan dipercepat jika Anda mengubahnya menjadi sesuatu yang lain. Itu sebabnya, jika Anda membaca banyak kode MathWorks, Anda akan melihatii
danjj
menggunakan indeks loop secara luas. Untuk sementara waktu, MathWorks bahkan mungkin secara tidak resmi menyarankan orang untuk melakukan itu sendiri (walaupun mereka selalu secara resmi menyarankan orang untuk memprogram keanggunan / pemeliharaan daripada apa pun yang dilakukan JIT saat ini, karena itu merupakan target yang bergerak setiap versi).Tapi itu sudah lama sekali, dan saat ini sedikit masalah "zombie" yang benar-benar jauh kurang penting daripada yang dipikirkan banyak orang, tetapi menolak untuk mati.
Dalam versi terbaru apa pun, itu benar-benar preferensi pribadi apakah akan menggunakan
i
danj
sebagai nama variabel atau tidak. Jika Anda melakukan banyak pekerjaan dengan bilangan kompleks, Anda mungkin ingin menghindarii
danj
sebagai variabel, untuk menghindari kemungkinan risiko kebingungan yang kecil (meskipun Anda juga / hanya ingin menggunakan1i
atau1j
mengurangi kebingungan, dan sedikit kinerja yang lebih baik ).Di sisi lain, dalam pekerjaan tipikal saya, saya tidak pernah berurusan dengan bilangan kompleks, dan saya menemukan kode saya lebih mudah dibaca jika saya merasa bebas untuk menggunakan
i
danj
sebagai indeks loop.Saya melihat banyak jawaban di sini yang mengatakan Tidak direkomendasikan ... tanpa mengatakan siapa yang melakukan rekomendasi itu. Inilah sejauh mana rekomendasi aktual MathWorks, dari dokumentasi rilis saat ini untuk
i
:sumber
Seperti dijelaskan dalam jawaban lain, penggunaan
i
kode umum tidak dianjurkan karena dua alasan:Seperti yang disarankan:
1i
danii
direkomendasikan. Namun, meskipun keduanya merupakan penyimpangan yang baiki
, tidak baik untuk menggunakan kedua alternatif ini bersama-sama.Berikut adalah contoh mengapa (secara pribadi) saya tidak menyukainya:
Seseorang tidak akan mudah salah membaca untuk dua atau tiga, tetapi dua dan tiga mirip satu sama lain.
Karenanya rekomendasi pribadi saya adalah: Jika Anda kadang-kadang bekerja dengan kode kompleks selalu gunakan
1i
dikombinasikan dengan variabel loop yang berbeda.Contoh surat indeks tunggal yang karena jika Anda tidak menggunakan banyak variabel lingkaran dan huruf mencukupi:
t
,u
,k
danp
Contoh indeks lagi:
i_loop
,step
,walk
, dant_now
Tentu saja ini adalah masalah selera pribadi, tetapi seharusnya tidak sulit untuk menemukan indeks untuk digunakan yang memiliki makna yang jelas tanpa tumbuh terlalu lama.
sumber
1i
akan berbeda warna sebagai angka :)doc i
dandoc j
: "Untuk kecepatan dan ketahanan yang ditingkatkan, Anda dapat mengganti kompleks i dan j dengan 1i." IMO, di Matlab saat ini tidak ada alasan untuk tidak menggunakani
danj
dalam loop, dll, atau untuk menggunakan apa pun selain1i
untuk menunjukkan unit imajiner (1j
berfungsi juga). Satu-satunya pengecualian adalah ketika meneruskan string ke mesin Simbol yang selalu sedikit tidak kompatibel. Anehhelp 1i
dandoc 1i
tidak bekerja.Itu menunjukkan bahwa itu
1i
adalah cara yang dapat diterima dan tidak ambigu untuk menulissqrt(-1)
, dan karena itu tidak perlu untuk menghindari penggunaani
. Kemudian lagi, seperti yang ditunjukkan Dennis ( https://stackoverflow.com/a/14893729/1967396 ), mungkin sulit untuk melihat perbedaan antara1i
danii
. Saran saya: gunakan1j
sebagai konstanta imajiner jika memungkinkan. Ini trik yang sama bahwa insinyur listrik mempekerjakan - mereka menggunakanj
untuksqrt(-1)
karenai
sudah diambil untuk saat ini .Secara pribadi saya tidak pernah menggunakan
i
danj
; Saya menggunakanii
danjj
sebagai variabel pengindeksan steno, (dan kk, ll, mm, ...) dan1j
ketika saya perlu menggunakan bilangan kompleks.sumber
1i
danii
" Dan bahkan lebih banyak perbedaan antara1
danl
dan antaraO
dan0
. Itu sebabnya langkah pertama yang saya lakukan dalam instalasi MATALB baru adalah mengubah ukuran font default.Kebingungan dengan unit imajiner telah dibahas dengan baik di sini, tetapi ada beberapa alasan yang lebih sederhana mengapa ini dan nama variabel satu huruf lainnya kadang-kadang tidak disarankan.
MATLAB secara khusus: jika Anda menggunakan coder untuk menghasilkan sumber C ++ dari kode MATLAB Anda (jangan, itu mengerikan) maka Anda secara eksplisit diperingatkan untuk tidak menggunakan kembali variabel karena potensi bentrokan pengetikan.
Secara umum, dan tergantung pada IDE Anda, nama variabel satu huruf dapat menyebabkan kekacauan dengan highlighters dan search / replace. MATLAB tidak menderita dari ini dan saya percaya Visual Studio tidak memiliki masalah untuk beberapa waktu tetapi standar pengkodean C / C ++ seperti MISRA dll cenderung untuk menyarankan mereka.
Untuk bagian saya, saya menghindari semua variabel huruf tunggal, meskipun keuntungan yang jelas untuk langsung menerapkan sumber-sumber matematika. Dibutuhkan sedikit usaha ekstra beberapa ratus kali pertama Anda melakukannya tetapi setelah itu Anda berhenti memperhatikan, dan keuntungan ketika Anda atau orang miskin lainnya datang untuk membaca kode Anda sangat banyak.
sumber
Setiap kode non-sepele berisi banyak
for
loop, dan praktik terbaik menyarankan Anda menggunakan nama deskriptif yang menunjukkan tujuan dan ruang lingkupnya. Untuk kali dahulu (dan kecuali skrip 5-10 baris yang tidak akan saya simpan), saya selalu menggunakan nama variabel sepertiidxTask
,idxAnotherTask
danidxSubTask
lain - lain.Atau paling tidak menggandakan huruf pertama dari array yang diindeks misalnya
ss
untuk mengindekssubjectList
,tt
untuk mengindekstaskList
, tetapi tidakii
ataujj
yang tidak membantu saya dengan mudah mengidentifikasi array mana yang mereka indeks keluar dari banyak untuk loop.sumber
Secara default
i
danj
berdiri untuk unit imajiner. Jadi dari sudut pandang MATLAB, menggunakani
sebagai variabel adalah seperti menggunakan1
sebagai variabel.sumber
i
danj
sebenarnya fungsi mengembalikan nilai satuan imajiner. Dimungkinkan untuk menggunakan variabel dengan nama yang sama sebagai fungsi dalam lingkup. Namun ini akan membayangi fungsinya.Kecuali jika Anda adalah pengguna yang sangat bingung saya pikir ada risiko yang sangat kecil dalam menggunakan nama variabel i dan j dan saya menggunakannya secara teratur. Saya belum melihat indikasi resmi bahwa praktik ini harus dihindari.
Meskipun benar bahwa membayangi unit imajiner dapat menyebabkan kebingungan dalam beberapa konteks seperti yang disebutkan dalam posting lain, secara keseluruhan saya tidak melihatnya sebagai masalah besar. Ada banyak hal membingungkan yang dapat Anda lakukan di MATLAB, misalnya mendefinisikan
false=true
Menurut pendapat saya satu-satunya waktu Anda mungkin harus menghindarinya adalah jika kode Anda secara khusus menangani angka imajiner.
sumber
i
ini adalah fungsi, itu dapat diganti dan digunakan sebagai variabel. Namun, yang terbaik adalah menghindari menggunakani
danj
untuk nama variabel jika Anda bermaksud menggunakannya dalam aritmatika kompleks." Itu, dalam hubungannya dengan komentar oleh Eitan T pada jawaban Oliver (saya kira dia menghitung waktunya) tampaknya bukti yang cukup.