Matlab'da i ve j'yi değişken olarak kullanma


142

ive jçok popüler değişken isimleridir (örneğin bu soruya ve bu soruya bakınız ).

Örneğin, döngüler halinde:

for i=1:10,
    % do something...
end

Matrise endeksler olarak:

mat( i, j ) = 4;

Neden olmamalı onlar Matlab değişken adı olarak kullanılacaktır?


5
Tabii ki böyle işaretlemeyeceğim, ama cevaplara bakıldığında bunun "öncelikle fikir tabanlı" olduğunu söyleyebilirim. ;-) Ben şahsen vazgeçmek olmaz i, j, kjenerik döngü değişkeni adları.
A. Donda

1
@ A.Donda iyi, bu senin fikrin;)
Shai

@Shai, bu sorudaki son cümleniz: "Matlab'da neden değişken adları olarak kullanılmasınlar?" Bu yüzden baskımı sorunuzda neden reddettiğiniz çok açık değil ?! Başlığınızı "neden Matlab'da i ve j'yi değişken olarak KULLANMAMALIM"
Seyfi

Yanıtlar:


176

Çünkü ive jher ikisi de hayali birimi gösteren işlevlerdir :

Bu nedenle, adlandırılan iveya jgeçersiz kılan bir değişken , karmaşık matematik yapan kodu sessizce bozabilir.

Olası çözümler arasında bunun yerine iive jjdöngü değişkenleri olarak veya hayali birimi temsil etmek için 1ine zaman igerekli olursa kullanılmalıdır.


42
Ayrıca, hiçbir şeyi kırmasanız bile, ive jdeğişken adlarını çözmek için yürütme süresinin hala feda edildiğini belirtmek gerekir .
Eitan T

14
@Eitan: Aslında bunu Matlab'ın JIT tarafından derlenmiş bir sürümünde kesin bir şekilde destekleyebilir misiniz? Ben hiç böyle olmadım (ve for1 milyar kez döngü çağıran basit testler zamanlamada istatistiksel bir fark göstermez). Hepimiz biliyoruz ki tam olarak bunu ele almak için özel bir kod vardır ve ive j(ve k?) Dışında değişkenler kullanmak aslında biraz daha yavaştır. Ve var olan farklılıklar gerçek hayatta var olmayanlar için miniktir. Kullanmak için hiçbir neden yoktur ive jdüzenli değişkenler olarak -sadece herhangi bir Matlab işlevi gibi düzgün bir şekilde kullanılması gerekir.
horchler

5
@horchler Eh, resmi belgeler devlet burada standart MATLAB veri sınıfları geçersiz kılma "performansı olumsuz yönde etkileyebilir" olması ve burada da sağlamlığı, hem de hız nedeniyle karmaşık sabitleri geçersiz kılma önlemek için ima edilir. In R2009b eski docs açıkça bu mayıs hinder JIT hızlanma gibi karmaşık sabitleri geçersiz kılma karşı tavsiye edilir. Değişken ad çözümlemesi belki küçüktür, ancak milyonlarca kez tekrarlanması önemli olabilir.
Eitan T

14
Matlab'ın eski versiyonlarında belki. Bunu kendim görürdüm. Ama en azından R2012a + (OS X) ile artık değil. Ve for1 milyar kez bir döngü çağırırken ve her zamanlama planını denerken hiçbir fark görmedim . Yeni SO kullanıcılarının, kullandıkları ive jdöngüleri yinelemek için mükemmel geçerli kodun yanlış olduğu söyleniyor . Açıkçası bu çok saçma ve kişiler bu sorunun daha önemli bir noktayı eksik: o ive jbir okunabilir Modern Matlab kodu yazmak istiyorsa bile hayali birim için kullanılmamalıdır.
horchler

12
büyük zaman tasarrufu benim için bir arama yaparken. Ben gerçek bir acı olabilir
craq

62

Değişkenlerden kaçınmak iyi bir uygulamadır ive jdeğişkenler veya hayali birim olmaları konusunda karışıklığı önlemek için değişkenlerdir.

Şahsen, ancak, kullandığım ive jkısa döngü değişkenler olarak oldukça sık olarak indeksini. Kendi kodunda sorunları önlemek için, ben ilgili başka iyi uygulamayı sürdüren ive j: do not hayali numaralarını belirtmek için bunları kullanın. Aslında, Matlab'ın kendi dokümantasyonu şunları ifade eder :

Hız ve daha fazla sağlamlık için, karmaşık yerini alabilir ive jtarafından 1i.

Bu nedenle, potansiyel bir çakışma nedeniyle çok sık kullanılan iki değişken adından kaçınmak yerine, hayali sayılar hakkında açıkım. Ayrıca kodumu daha net hale getirir. Gördüğüm 1izaman, temsil ettiğini biliyorum sqrt(-1)çünkü muhtemelen bir değişken olamazdı.


2
Kullanmak gerçekten iyi bir uygulamadır 1i. Ancak, anlamını değiştirerek ive jgibi sert debug hatalara yol açabilir bu bir .
Shai

1
@Shai İyi bir nokta. Bundan kaçınmak ive jen iyisi olduğunu kabul etmek için cevabımı değiştirdim , ancak kişisel kodlama tarzımın bu kurala nasıl uymadığını açıkladım.
shoelzer

2
Belirtilen hızın çok önemli görünmediğini unutmayın: stackoverflow.com/questions/18163454/…
Dennis Jaheruddin

Tamamen katılıyorum! İyi uygulama karmaşık matematik için 1ideğil HER ZAMAN kullanım iiçindir. Hayali sayı olarak düşünelim ve hayali sayı olarak kötü bir uygulama 1ialalım i. Tam tersi değil. Kullanılması i, ii, iiiMatlab genel bir uygulamadır ve insanlar sopa sorun yoktur 1ive 1jkarmaşık sayı için. Ayrıca Matlab buna saygı duyuyor ve bu, önceki cevapta belirtildiği gibi performansı (test ettiğim kadar) azaltmıyor.
SdidS

i ve j hiçbir şekilde kullanılmamalıdır - bu sayılar bir şey ifade eder - amacı açıklayan bir ad kullanın (row_n, elementNo, listItemIndex, vb.). Yani çok daha kolay kimse ne yaptığını, debug, vb anlamak için harcanan ekstra zaman daha değerinde daha atılabilen senaryo daha herhangi bir şey için uzun vadeli sürdürülebilirliği de kazanç daha - hatta Matlab Editör iyi arkasında olmakla birlikte diğer modern IDE'lerin çoğu.
LightCC

27

MATLAB'ın eski sürümlerinde, değişken adların kullanılmasından ive jdeğişken adlarından kaçınmak için iyi bir neden vardı - MATLAB JIT'in ilk sürümleri, bunları değişken veya sanal birimler olarak kullanıp kullanmadığınızı anlayacak kadar zeki değildi ve bu nedenle başka türlü olası optimizasyonları kapatın.

Bu nedenle kodunuz değişkenlerin varlığı ive varlığı ile yavaşlar jve bunları başka bir şeye değiştirirseniz hızlanır. Bu nedenle, çok fazla MathWorks kodu okursanız , döngü indeksleri olarak oldukça yaygın olarak görür iive jjkullanırsınız. Bir süre için MathWorks, insanlara bunu yapmaları için gayri resmi olarak tavsiyede bulunmuş olabilir (her zaman, her sürümde hareketli bir hedef olduğu için, her zaman resmi JIT'in yaptığı şeyden ziyade zarafet / sürdürülebilirlik için programlamalarını tavsiye etseler de).

Ama bu oldukça uzun zaman önceydi ve günümüzde birçok insanın hala düşündüğünden çok daha az önemli olan ama ölmeyi reddeden bir "zombi" sorunu.

Herhangi yeni versiyonda, gerçekten olup olmadığını kullanımına kişisel bir tercih ive jdeğişken isimleri olarak ya da değil. Karmaşık sayılarla çok iş yaparsanız, kaçınmak isteyebilirsiniz ive jayrıca / yerine sadece kullanmak isteyebilirsiniz rağmen değişken olarak, (karışıklık herhangi küçük riskini ortadan kaldırmak için 1iya 1jda az karışıklık ve biraz daha iyi performans için ).

Öte yandan, tipik işimde asla karmaşık sayılarla uğraşmam ve kullanmakta özgürsem ive jdöngü indeksleri olarak kodumu daha okunabilir buluyorum .


Burada kimin tavsiye ettiğini söylemeden tavsiye edilmediğini söyleyen birçok cevap görüyorum . MathWorks'ün şu anki sürüm belgelerindeki gerçek önerilerinin kapsamı i:

İ bir işlev olduğundan, geçersiz kılınabilir ve değişken olarak kullanılabilir. Bununla birlikte, değişken adlar için karmaşık aritmetik olarak kullanmak istiyorsanız, i ve j kullanmaktan kaçınmak en iyisidir. [...] Hız ve gelişmiş sağlamlık için karmaşık i ve j'yi 1i ile değiştirebilirsiniz.


15

Diğer cevaplarda açıklandığı gibi i, genel kodun kullanılması iki nedenden dolayı önerilmez:

  • Hayali numarayı kullanmak istiyorsanız, bir dizinle karıştırılabilir veya bir dizinle üzerine yazılabilir
  • Bir indeks olarak kullanırsanız, üzerine yazabilir veya hayali sayı ile karıştırılabilir.

Önerildiği gibi: 1ive iiönerilir. Bununla birlikte, bunların her ikisi de ince sapmalar olsa da i, bu alternatiflerin her ikisini birlikte kullanmak çok hoş değildir.

İşte (kişisel olarak) sevmiyorum bir örnek:

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

Biri iki veya üç kişi için kolayca yanlış okunmaz, ancak iki ve üç birbiri ile benzerdir.

Bundan dolayı kişisel tavsiyem şunlar olabilir: Bazen karmaşık kodlarla çalışmanız durumunda her zaman 1ifarklı bir döngü değişkeni ile birlikte kullanın .

Birçok döngü değişkenleri ve mektuplar toparlayıcı kullanmazsanız için bu tek harf endeksleri örnekler: t, u, kvep

Uzun indekslerinin örnek: i_loop, step, walkvet_now

Tabii ki bu kişisel bir zevk meselesidir, ancak çok uzun büyümeden açık bir anlamı olan endeksleri bulmak zor olmamalıdır.


1
1i, hayali birimi belirtir (ayrıca Matlab değişken adları bir sayı ile başlayamaz)
lib

2
@DennisJaheruddin: shameless plug: StackLflow için MATLAB sözdizimini vurgulayan kullanıcı metnimi kullan . Son örnekte, 1isayı olarak farklı renklendirilecek :)
Amro

2
Doğrudan doc ive doc j: "Hız ve gelişmiş sağlamlık için karmaşık i ve j'yi 1i ile değiştirebilirsiniz." IMO, şimdiki Matlab kullanmayın için hiçbir neden yoktur ive jvb döngüler içinde veya dışında kullanım şey 1i(hayali birimini belirtmek için 1jçalışır çok). Bunun tek istisnası, dizeleri her zaman biraz uyumsuz Sembolik motora geçirmektir. Garip help 1ive doc 1iyine de çalışmıyor.
horchler

11

Bu işaret edildi 1iyazma için kabul edilebilir ve net yoldur sqrt(-1)ve bu nedenle kullanmaktan kaçınmak gerek olmadığını i. Sonra tekrar, Dennis'in işaret ettiği gibi ( https://stackoverflow.com/a/14893729/1967396 ), 1ive arasındaki farkı görmek zor olabilir ii. Benim önerim: 1jmümkünse hayali sabit olarak kullanın . Kullandıkları - Bu elektrik mühendisleri istihdam aynı numara jiçin sqrt(-1)çünkü izaten alınmış geçerli .

Şahsen ben asla kullanmam ive j; Kullandığım iive jjsteno indeksleme değişkenleri, (ve kk, ll, mm, ...) gibi 1jzaman karmaşık sayıları kullanmak gerekir.


2
"arasındaki farkı görmek zor olabilir 1ive iiaralarında Ve daha da fark" 1ve larasında Ove 0. Bu yüzden yeni bir MATALB kurulumunda ilk adım varsayılan yazı tipi boyutunu değiştirmektir.
glglgl

6

Hayali birimle olan karışıklık burada iyi bir şekilde ele alınmıştır, ancak bunların ve diğer tek harfli değişken adlarının bazen cesaret kırılmasının daha belirgin nedenleri vardır.

  1. MATLAB özellikle: MATLAB kodunuzdan C ++ kaynağı oluşturmak için kodlayıcı kullanıyorsanız (etmeyin, korkunç değildir), potansiyel yazım çakışmaları nedeniyle değişkenleri yeniden kullanmamanız konusunda açıkça uyarılırsınız.

  2. Genellikle ve IDE'nize bağlı olarak, tek harfli bir değişken adı vurgulayıcılar ve arama / değiştirme ile hasara neden olabilir. MATLAB bundan muzdarip değil ve Visual Studio'nun bir süredir sorun yaşamadığına inanıyorum, ancak MISRA vb.Gibi C / C ++ kodlama standartları onları hedef almayı tavsiye ediyor.

Benim açımdan, matematik kaynaklarının doğrudan uygulanması için bariz avantajlara rağmen, tüm tek harfli değişkenlerden kaçınırım. Bunu ilk birkaç yüz kez yapmak biraz çaba gerektiriyor, ancak bundan sonra fark etmeyi bırakıyorsunuz ve siz veya başka bir fakir ruhun kodunuzu okumaya geldiğinde avantajları lejyon.


4

Önemsiz herhangi bir kod birden fazla fordöngü içerir ve en iyi uygulamalar, amacını ve kapsamını belirten açıklayıcı bir ad kullanmanızı önerir. İçin kez ezelden (ve kurtarmaya gitmiyorum yönündeki 5-10 satır komut sürece), ben her zamanki gibi değişken adları kullanıyorum idxTask, idxAnotherTaskve idxSubTaskvb

Ya çok azından örneğin endekslemeyecek dizinin ilk harfini iki katına de ssendekse subjectList, ttendekse taskListdeğil, iiya jjhangi beni zahmetsizce onlar döngüler için benim birden dışarı indeksleme hangi diziyi tanımlamak yardımcı olmuyor.


3

Varsayılan olarak ive jhayali birimi temsil edin. MATLAB'ın bakış açısından, ideğişken olarak kullanmak bir şekilde değişken olarak kullanmak gibidir 1.


5
Bence öyle değil. i yasal bir değişken adıdır, bu nedenle i ve j'yi değişken adları olarak kullanabilirsiniz. önceki bir cevaptan bahsedildiği gibi, hayali anlamı maskeleyecektir. 1 yasal bir değişken adı değil. karmaşık sayıları hiç kullanmazsanız tamamen iyi olur.
thang

@thang bu yüzden "bir şekilde beğen" dedim, "beğen" değil. Bir fark olduğunu biliyorum. OP neden kullanılmamaları gerektiğini sordu, bunun bir sayıyı ifade ettikleri için açıklamaya çalıştım.
yo '

2
tamam üzgünüm, nasılsa ne demek bilmiyorum . benim için çok farklı çünkü iyi, isteseniz bile 1'i değişken olarak kullanamazsınız ... ama nereden geldiğinizi görüyorum.
thang

Eğer yapabilirsiniz de (bu yerleşik işlevleri ileride kullanılmak üzere / sabitleri bozması ve aynı zamanda) değişkenleri için mevcut fonksiyon adları kullanabilirsiniz olarak, bunları kullanın. Gerçekten istediğiniz başka bir şey olsun (imo basit cevap: hayır)
Gunther Struyf

1
Üzgünüm, ama bu açıklama bir anlam ifade etmiyor. iVe jaslında hayali biriminin değerini döndüren fonksiyonlar bulunmaktadır. Bir kapsamdaki işlevle aynı ada sahip bir değişken kullanmak mümkündür. Ancak bu, işlevi gölgeleyecektir.
patrik

2

Çok karışık bir kullanıcı değilseniz, i ve j değişken adlarını kullanma riskinin çok az olduğunu düşünüyorum ve bunları düzenli olarak kullanıyorum. Bu uygulamanın kaçınılması gerektiğine dair resmi bir işaret görmedim.

Hayali birimin gölgelenmesinin diğer yazılarda belirtildiği gibi bazı bağlamlarda karışıklığa neden olabileceği doğru olsa da, genel olarak bunu büyük bir sorun olarak görmüyorum. MATLAB'da yapabileceğiniz çok daha karmaşık şeyler var, örneğin tanımlamakfalse=true

Bence muhtemelen onlardan kaçınmanız gereken tek zaman, kodunuzun özellikle hayali sayılarla ilgilenmesidir.


Oylama yaparken lütfen yorum yapabilir misiniz? Örneğin, uygulamanın önerilmediğini belirten bir Mathworks bağlantısıyla (resmi bir yönerge referans verilmeksizin birden fazla poster tarafından belirtilmiştir). Aslında döngülerde 'i' kullanmak Mathworks'ün resmi örneklerinde kullanılıyor. Deneyimlerime göre, bu kodu açık ve özlü hale getirir ve çok yaygın bir uygulamadır.
gregswiss

1
Atıfta belgeleri "yana ibir fonksiyondur, bu geçersiz kılınmış ve bir değişken olarak kullanılabilir. Ancak, kullanmaktan kaçınmak en iyisidir ive jkarmaşık aritmetik bunları kullanmayı düşünüyorsanız değişken adları için." Bu, Eitan T'nin Oliver'ın cevabına (sanırım zamanladı) cevabıyla ilgili yorumla birlikte yeterli kanıt gibi görünüyor.
Adriaan

1
Ayrıca 2013'ten @Adriaan'ın bahsettiği yorumu içeren bir yanıt olduğunu unutmayın .
Andras Deak

1
bu yüzden belgeler karmaşık aritmetikte kullanmayı planlıyorsanız, aksi takdirde geçerli değildir - neden herkesin bu konuda bu kadar telaşlı olduğunu bilmiyorum! Sadece alternatif bir bakış açısı sunuyordum.
gregswiss
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.