Menggunakan i dan j sebagai variabel dalam Matlab

142

idan jnama 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?

Shai
sumber
5
Tentu saja saya tidak akan menandainya seperti itu, tetapi menilai dari jawaban saya akan mengatakan ini "terutama berdasarkan pendapat". ;-) Saya pribadi tidak akan menyerah pada i, j, ksebagai nama variabel loop generik.
A. Donda
1
@ A.Donda baik, ini adalah Anda pendapat;)
Shai
@Shai, ini adalah kalimat terakhir Anda dalam pertanyaan ini: "Mengapa mereka tidak digunakan sebagai nama variabel di Matlab?" Jadi sangat tidak jelas mengapa Anda menolak edisi saya karena pertanyaan Anda ?! Saya mengubah judul Anda menjadi judul yang lebih konstruktif "Mengapa TIDAK boleh menggunakan i dan j sebagai variabel di Matlab"
Seyfi

Jawaban:

176

Karena idan jkeduanya fungsi yang menunjukkan unit imajiner :

Jadi variabel dipanggil iatau jakan menimpanya, berpotensi memecahkan kode yang melakukan matematika kompleks.

Solusi yang mungkin termasuk menggunakan iidan jjsebagai variabel loop, atau menggunakan 1ikapan pun idiperlukan untuk mewakili unit imajiner.

Oliver Charlesworth
sumber
42
Perlu juga dicatat bahwa bahkan jika Anda tidak melanggar apa pun, waktu eksekusi masih dikorbankan untuk menyelesaikan idan jnama variabel.
Eitan T
14
@Eitan: Bisakah Anda benar-benar mendukungnya dengan cara konklusif konkret dalam versi kompilasi JIT dari Matlab? Saya belum pernah menemukan itu menjadi kasusnya (dan tes sederhana yang memanggil forloop 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 selain idan j(dan k?) Sebenarnya sedikit lebih lambat. Dan perbedaan yang ada sangat kecil hingga tidak ada dalam kehidupan nyata. Tidak ada alasan untuk TIDAK menggunakan idan jsebagai variabel biasa -mereka hanya harus digunakan dengan benar seperti fungsi Matlab lainnya.
horchler
5
@horchler Baiklah, dokumen resmi menyatakan di sini bahwa mengesampingkan kelas data MATLAB standar "dapat memengaruhi kinerja secara negatif", dan di sini tersirat untuk menghindari mengesampingkan konstanta kompleks untuk alasan kecepatan, serta ketahanan. Dalam dokumen lama R2009b , secara eksplisit direkomendasikan untuk tidak mengesampingkan konstanta kompleks, karena ini dapat menghambat akselerasi JIT. Resolusi nama variabel mungkin sangat kecil, tetapi mungkin signifikan jika diulang jutaan kali.
Eitan T
14
Dalam versi kuno Matlab mungkin. Saya terbiasa melihat itu sendiri. Tapi tidak lagi dengan R2012a + (OS X) setidaknya. Dan saya tidak melihat perbedaan ketika memanggil forloop 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 menggunakan idan juntuk mengulangi loop. Terus terang itu konyol dan orang-orang kehilangan poin yang lebih penting dari pertanyaan ini: itu idan jbahkan tidak boleh digunakan untuk unit imajiner jika seseorang ingin menulis kode Matlab modern yang dapat dibaca.
horchler
12
hemat waktu saya yang utama adalah ketika melakukan pencarian untuk ii. Mencari saya bisa sangat menyakitkan
craq
62

Merupakan praktik yang baik untuk menghindari idan jvariabel untuk mencegah kebingungan tentang mereka menjadi variabel atau unit imajiner.

Namun secara pribadi, saya menggunakan idanj sebagai variabel cukup sering sebagai indeks loop pendek. Untuk menghindari masalah dalam kode saya sendiri, saya mengikuti praktik baik lainnya mengenai idan j: jangan menggunakannya untuk menunjukkan angka imajiner. Bahkan, dokumentasi Matlab sendiri menyatakan :

Untuk kecepatan dan ketahanan yang ditingkatkan, Anda dapat mengganti kompleks idan jdengan 1i.

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 melihat1i , saya tahu itu mewakili sqrt(-1)karena tidak mungkin menjadi variabel.

pembuat sepatu
sumber
2
Ini memang praktik yang baik untuk digunakan 1i. Namun, mengubah makna idan jdapat menyebabkan kesalahan sulit untuk debug seperti yang ini .
Shai
1
@Shai Poin bagus. Saya mengubah jawaban saya untuk mengakui bahwa menghindari idan jyang terbaik, tetapi menjelaskan bagaimana gaya pengkodean pribadi saya tidak mengikuti aturan itu.
pembuat sepatu
2
Perhatikan bahwa kecepatan yang disebutkan tampaknya tidak terlalu signifikan: stackoverflow.com/questions/18163454/…
Dennis Jaheruddin
Setuju! Praktik yang baik adalah SELALU digunakan 1idan bukan iuntuk matematika yang rumit. Mari kita pikirkan angka imajiner sebagai 1idan menganggap iangka imajiner sebagai praktik buruk. Bukan sebaliknya. Menggunakan i, ii, iiiadalah praktek yang umum di Matlab dan tidak ada masalah ketika orang-orang menempel 1idan 1juntuk nomor kompleks. Matlab juga menghargai ini dan yang ini tidak menurunkan kinerja (sejauh yang saya uji) seperti yang dinyatakan dalam jawaban sebelumnya.
Sdid
i dan j tidak boleh digunakan - angka-angka itu berarti sesuatu - gunakan nama yang menjelaskan tujuan (row_n, elementNo, listItemIndex, dll.). Jadi lebih mudah bagi seseorang untuk memahami apa yang Anda lakukan, untuk debug, dll waktu ekstra menghabiskan lebih dari layak keuntungan dalam pemeliharaan jangka panjang untuk sesuatu yang lebih dari naskah membuang-jauhnya - bahkan dengan Matlab Editor yang baik di belakang sebagian besar IDE modern lainnya.
LightCC
27

Dalam versi lama MATLAB, dulu ada alasan bagus untuk menghindari penggunaan idanj 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 idan jsebagai variabel, dan akan dipercepat jika Anda mengubahnya menjadi sesuatu yang lain. Itu sebabnya, jika Anda membaca banyak kode MathWorks, Anda akan melihat iidan jjmenggunakan 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 idan jsebagai nama variabel atau tidak. Jika Anda melakukan banyak pekerjaan dengan bilangan kompleks, Anda mungkin ingin menghindari idan jsebagai variabel, untuk menghindari kemungkinan risiko kebingungan yang kecil (meskipun Anda juga / hanya ingin menggunakan 1iatau 1jmengurangi 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 idan jsebagai 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:

Karena saya adalah fungsi, itu dapat diganti dan digunakan sebagai variabel. Namun, yang terbaik adalah menghindari menggunakan i dan j untuk nama variabel jika Anda bermaksud menggunakannya dalam aritmatika kompleks. [...] Untuk kecepatan dan ketahanan yang ditingkatkan, Anda dapat mengganti kompleks i dan j dengan 1i.

Sam Roberts
sumber
15

Seperti dijelaskan dalam jawaban lain, penggunaan ikode umum tidak dianjurkan karena dua alasan:

  • Jika Anda ingin menggunakan nomor imajiner, itu dapat dikacaukan dengan atau ditimpa oleh indeks
  • Jika Anda menggunakannya sebagai indeks, ia dapat ditimpa atau dikacaukan dengan angka imajiner

Seperti yang disarankan: 1idan iidirekomendasikan. Namun, meskipun keduanya merupakan penyimpangan yang baik i, tidak baik untuk menggunakan kedua alternatif ini bersama-sama.

Berikut adalah contoh mengapa (secara pribadi) saya tidak menyukainya:

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

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 1idikombinasikan dengan variabel loop yang berbeda.

Contoh surat indeks tunggal yang karena jika Anda tidak menggunakan banyak variabel lingkaran dan huruf mencukupi: t, u, kdanp

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.

Dennis Jaheruddin
sumber
1
1i menunjukkan unit imajiner (juga nama variabel Matlab tidak dapat dimulai dengan angka)
lib
2
@DennisJaheruddin: plug shameless: Gunakan sintaks MATLAB saya menyoroti userscript untuk Stack Overflow. Dalam contoh terakhir, 1iakan berbeda warna sebagai angka :)
Amro
2
Langsung dari doc idan doc 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 menggunakan idan jdalam loop, dll, atau untuk menggunakan apa pun selain 1iuntuk menunjukkan unit imajiner ( 1jberfungsi juga). Satu-satunya pengecualian adalah ketika meneruskan string ke mesin Simbol yang selalu sedikit tidak kompatibel. Aneh help 1idan doc 1itidak bekerja.
horchler
11

Itu menunjukkan bahwa itu 1iadalah cara yang dapat diterima dan tidak ambigu untuk menulis sqrt(-1), dan karena itu tidak perlu untuk menghindari penggunaan i. Kemudian lagi, seperti yang ditunjukkan Dennis ( https://stackoverflow.com/a/14893729/1967396 ), mungkin sulit untuk melihat perbedaan antara 1idan ii. Saran saya: gunakan 1jsebagai konstanta imajiner jika memungkinkan. Ini trik yang sama bahwa insinyur listrik mempekerjakan - mereka menggunakan juntuk sqrt(-1)karena isudah diambil untuk saat ini .

Secara pribadi saya tidak pernah menggunakan idan j; Saya menggunakan iidan jjsebagai variabel pengindeksan steno, (dan kk, ll, mm, ...) dan 1jketika saya perlu menggunakan bilangan kompleks.

Floris
sumber
2
"Sulit untuk melihat perbedaan antara 1idan ii" Dan bahkan lebih banyak perbedaan antara 1dan ldan antara Odan 0. Itu sebabnya langkah pertama yang saya lakukan dalam instalasi MATALB baru adalah mengubah ukuran font default.
glglgl
6

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.

  1. 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.

  2. 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.

xenoclast
sumber
4

Setiap kode non-sepele berisi banyak forloop, 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 seperti idxTask, idxAnotherTaskdan idxSubTasklain - lain.

Atau paling tidak menggandakan huruf pertama dari array yang diindeks misalnya ssuntuk mengindeks subjectList, ttuntuk mengindeks taskList, tetapi tidak iiatau jjyang tidak membantu saya dengan mudah mengidentifikasi array mana yang mereka indeks keluar dari banyak untuk loop.

Pradeep Reddy Raamana
sumber
3

Secara default idanj berdiri untuk unit imajiner. Jadi dari sudut pandang MATLAB, menggunakan isebagai variabel adalah seperti menggunakan 1sebagai variabel.

yo'
sumber
5
Saya kira itu tidak seperti itu. i adalah nama variabel yang sah, sehingga Anda benar-benar dapat menggunakan i dan j sebagai nama variabel. itu akan, seperti jawaban sebelumnya menyebutkan, menutupi makna imajiner. 1 bukan nama variabel yang sah. tidak apa-apa jika Anda tidak pernah menggunakan bilangan kompleks.
thang
@thang itu sebabnya saya bilang "entah bagaimana suka" dan bukan "suka". Saya tahu ada perbedaan. OP bertanya mengapa mereka tidak boleh digunakan, saya mencoba menjelaskan bahwa itu karena mereka sudah menyatakan nomor.
yo '
2
ok, maaf, entah bagaimana artinya. bagi saya itu jelas berbeda karena, Anda tidak dapat menggunakan 1 sebagai variabel bahkan jika Anda ingin ... tetapi saya melihat dari mana Anda berasal.
thang
Anda dapat menggunakannya, karena Anda juga dapat menggunakan nama fungsi yang ada untuk variabel (dan pada saat yang sama merusak fungsi / konstanta bawaan untuk penggunaan lebih lanjut). Apakah Anda benar-benar menginginkan itu adalah hal lain (jawaban sederhana imo: tidak)
Gunther Struyf
1
Maaf, tapi penjelasan ini tidak masuk akal. The idan jsebenarnya fungsi mengembalikan nilai satuan imajiner. Dimungkinkan untuk menggunakan variabel dengan nama yang sama sebagai fungsi dalam lingkup. Namun ini akan membayangi fungsinya.
patrik
2

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 mendefinisikanfalse=true

Menurut pendapat saya satu-satunya waktu Anda mungkin harus menghindarinya adalah jika kode Anda secara khusus menangani angka imajiner.

gregswiss
sumber
Bisakah Anda berkomentar saat melakukan voting. Misalnya dengan tautan Mathworks yang menunjukkan bahwa praktik tersebut tidak disarankan (yang telah dinyatakan oleh banyak poster tanpa merujuk pedoman resmi apa pun). Bahkan menggunakan 'i' dalam loop sedang digunakan dalam contoh resmi oleh Mathworks. Dalam pengalaman saya itu membuat kode jelas dan ringkas dan merupakan praktik yang sangat umum.
gregswiss
1
Mengutip dokumentasi "Karena iini adalah fungsi, itu dapat diganti dan digunakan sebagai variabel. Namun, yang terbaik adalah menghindari menggunakan idan juntuk 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.
Adriaan
1
Perhatikan juga bahwa sudah ada jawaban dari tahun 2013 dengan komentar yang disebutkan oleh @Adriaan.
Andras Deak
1
jadi dokumentasi menyatakan JIKA Anda bermaksud menggunakan aritmatika kompleks, jika tidak itu tidak berlaku - tidak tahu mengapa semua orang sangat rewel di sini! Saya hanya menawarkan sudut pandang alternatif.
gregswiss