i
i j
są bardzo popularnymi nazwami zmiennych (patrz np. to pytanie i to ).
Na przykład w pętlach:
for i=1:10,
% do something...
end
Jako wskaźniki do macierzy:
mat( i, j ) = 4;
Dlaczego nie powinny być używane jako nazwy zmiennych w Matlabie?
i
,j
,k
jako ogólnych nazw zmiennych pętli.Odpowiedzi:
Ponieważ obie funkcje oznaczające urojoną jednostkę są
i
ij
są :Tak więc zmienna wywołuje je
i
lubj
będzie je zastępować, potencjalnie powodując ciche uszkodzenie kodu wykonującego złożone obliczenia.Możliwe rozwiązania obejmują użycie zamiast nich
ii
ijj
jako zmiennych pętli lub użycie1i
ilekroći
jest wymagane do przedstawienia jednostki urojonej.źródło
i
ij
.for
pętlę 1 miliard razy nie wykazują statystycznej różnicy w czasie). Z tego, co wiemy, istnieje specjalny kod, który dokładnie to obsługuje, a używanie zmiennych innych niżi
ij
(ik
?) Jest w rzeczywistości nieco wolniejsze. A różnice, które istnieją, są znikome lub nieistniejące w prawdziwym życiu. Po prostu nie ma powodu, aby NIE używać,i
aj
jako zwykłe zmienne - po prostu muszą być używane poprawnie, jak każda inna funkcja Matlab.for
pętlę 1 miliard razy i próbowałem różnych schematów czasowych. Widzę, jak nowym użytkownikom SO mówi się, że całkowicie poprawny kod jest zły, ponieważ używająi
ij
iterują pętle. Szczerze mówiąc, jest to po prostu głupie i ludzie pomijają ważniejszy punkt tego pytania: toi
ij
nie powinno być nawet używane w wyimaginowanej jednostce, jeśli chce się napisać czytelny, nowoczesny kod Matlab.Dobrą praktyką jest unikanie zmiennych
i
ij
zapobieganie nieporozumieniom co do tego, że są zmiennymi lub jednostką urojoną.Osobiście jednak używam
i
ij
jako zmiennych dość często jako indeksu krótkich pętli. Aby uniknąć problemów we własnym kodzie, postępuję zgodnie z inną dobrą praktyką dotyczącąi
ij
: nie używaj ich do oznaczania liczb urojonych. W rzeczywistości własna dokumentacja Matlab stwierdza :Więc zamiast unikać dwóch bardzo często używanych nazw zmiennych z powodu potencjalnego konfliktu, wyraźnie mówię o liczbach urojonych. Dzięki temu mój kod jest bardziej przejrzysty. Za każdym razem, gdy widzę
1i
, wiem, że to reprezentuje,sqrt(-1)
ponieważ nie może być zmienną.źródło
1i
. Jednak zmiana znaczeniai
ij
może prowadzić do trudnych do debugowania błędów, takich jak ten .i
ij
jest najlepsze, ale wyjaśniłem, że mój osobisty styl kodowania nie jest zgodny z tą zasadą.1i
a niei
skomplikowanej matematyki. Pomyślmy o liczbie urojonej jako o liczbie urojonej1i
i potraktujmy jąi
jako złą praktykę. Nie na odwrót. Korzystaniei
,ii
,iii
jest powszechną praktyką w Matlab i nie ma problemu, gdy ludzie trzymać się1i
i1j
dla liczby zespolonej. Matlab również to szanuje, a ten nie zmniejsza wydajności (o ile testowałem), jak stwierdzono w poprzedniej odpowiedzi.W starszych wersjach MATLAB-a istniał dobry powód, aby unikać używania
i
ij
jako nazw zmiennych - wczesne wersje MATLAB JIT nie były wystarczająco sprytne, aby stwierdzić, czy używasz ich jako zmiennych, czy jako jednostek urojonych, a zatem wyłącz wiele możliwych optymalizacji.Twój kod stałby się zatem wolniejszy tylko przez samą obecność zmiennych
i
ij
jako zmienne i przyspieszyłby, gdybyś zmienił je na coś innego. Dlatego, jeśli przeczytasz dużo kodu MathWorks, zobaczyszii
i będzieszjj
używany dość powszechnie jako indeksy pętli. Przez pewien czas MathWorks mógł nawet nieoficjalnie doradzać ludziom, aby robili to sami (chociaż zawsze oficjalnie radzą ludziom, aby programowali pod kątem elegancji / łatwości konserwacji, a nie tego, co robi obecny JIT, ponieważ jest to ruchomy cel każdej wersji).Ale to raczej dawno temu, a obecnie jest to trochę problem z zombie, który jest naprawdę o wiele mniej ważny, niż wielu ludzi wciąż myśli, ale nie chce umrzeć.
W każdej najnowszej wersji to naprawdę osobiste preferencje, czy używać
i
ij
jako nazw zmiennych, czy nie. Jeśli wykonujesz dużo pracy z liczbami zespolonymi, możesz chcieć uniknąći
ij
jako zmiennych, aby uniknąć małego potencjalnego ryzyka pomyłki (chociaż możesz również / zamiast tego używać tylko1i
lub1j
dla jeszcze mniejszego zamieszania i trochę lepszej wydajności ).Z drugiej strony, w mojej typowej pracy nigdy nie zajmuję się liczbami zespolonymi, a mój kod wydaje mi się bardziej czytelny, jeśli mogę swobodnie używać
i
ij
jako indeksów pętli.Widzę tutaj wiele odpowiedzi, które mówią, że to nie jest zalecane ... bez mówienia, kto robi to polecanie. Oto zakres rzeczywistych zaleceń MathWorks z aktualnej dokumentacji wydania dla
i
:źródło
Jak opisano w innych odpowiedziach, używanie
i
ogólnego kodu nie jest zalecane z dwóch powodów:Zgodnie z sugestią:
1i
iii
są zalecane. Jednak, chociaż są to drobne odstępstwa odi
, nie jest zbyt przyjemne używanie obu tych alternatyw razem.Oto przykład, dlaczego (osobiście) mi się to nie podoba:
Jeden nie będzie łatwo odczytany z dwóch lub trzech, ale dwa i trzy są do siebie podobne.
Dlatego moja osobista rekomendacja byłaby taka: jeśli czasami pracujesz ze złożonym kodem, zawsze używaj
1i
kombinacji z inną zmienną pętli.Przykłady wskaźników pojedynczą literę że jeśli nie korzystać z wielu zmiennych, pętli i listów wystarczyć:
t
,u
,k
ip
Przykład dłuższych indeksach:
i_loop
,step
,walk
it_now
Oczywiście jest to również kwestia osobistego gustu, ale nie powinno być trudno znaleźć indeksy, które będą miały jasne znaczenie, bez zbytniego wydłużania się.
źródło
1i
będzie różnie kolorowana jako liczba :)doc i
idoc j
: „Aby uzyskać szybkość i lepszą wytrzymałość, można zastąpić złożone i i j przez 1i”. IMO, w obecnym Matlabie nie ma powodu, aby nie używaći
ij
w pętlach itp., Ani używać niczego innego niż1i
oznaczanie wyimaginowanej jednostki (1j
działa też). Jedynym wyjątkiem jest przekazywanie ciągów znaków do zawsze nieznacznie niekompatybilnego silnika Symbolic. Dziwne, żehelp 1i
idoc 1i
nie działają jednak.Zwrócono uwagę, że
1i
jest to akceptowalny i jednoznaczny sposób pisaniasqrt(-1)
i jako taki nie ma potrzeby unikania używaniai
. Z drugiej strony, jak wskazał Dennis ( https://stackoverflow.com/a/14893729/1967396 ), może być trudno dostrzec różnicę między1i
iii
. Moja sugestia:1j
jeśli to możliwe, używaj jako wyimaginowanej stałej. To ten sam trik, który inżynierowie elektrycy zatrudnić - używająj
dosqrt(-1)
ponieważi
jest już zajęta przez prąd .Osobiście nigdy nie używam
i
ij
; Używamii
ijj
jako skrótowych zmiennych indeksujących (i kk, ll, mm, ...) i1j
kiedy muszę użyć liczb zespolonych.źródło
1i
iii
” A jeszcze bardziej różnicę między1
il
i międzyO
a0
. Dlatego pierwszym krokiem, który wykonuję w nowej instalacji MATALB, jest zmiana domyślnego rozmiaru czcionki.Pomieszanie z jednostką urojoną zostało tutaj dobrze omówione, ale istnieją inne, bardziej prozaiczne powody, dla których te i inne jednoliterowe nazwy zmiennych są czasami odradzane.
W szczególności MATLAB: jeśli używasz kodera do generowania źródła C ++ ze swojego kodu MATLAB (nie rób tego, to okropne), jesteś wyraźnie ostrzeżony, aby nie używać ponownie zmiennych z powodu potencjalnych konfliktów podczas pisania.
Ogólnie iw zależności od IDE, jednoliterowa nazwa zmiennej może spowodować spustoszenie w podświetlaczach i wyszukiwaniu / zamianie. MATLAB nie cierpi z tego powodu i uważam, że Visual Studio od jakiegoś czasu nie miał problemu, ale standardy kodowania C / C ++, takie jak MISRA itp., Zwykle radzą im przeciwdziałać.
Ze swojej strony unikam wszystkich zmiennych jednoliterowych, pomimo oczywistych zalet wynikających z bezpośredniego implementowania źródeł matematycznych. Zajmuje to trochę więcej wysiłku, gdy robisz to pierwsze kilkaset razy, ale potem przestajesz zauważać, a korzyści płynące z tego, że ty lub jakaś inna biedna dusza przychodzą, aby przeczytać twój kod, są ogromne.
źródło
Każdy nietrywialny kod zawiera wiele
for
pętli, a najlepsze praktyki zalecają użycie opisowej nazwy wskazującej na jego cel i zakres. Dla niepamiętnych czasów (i chyba jej 5-10 linii skryptu, że nie zamierzam zapisać), zawsze byłem przy użyciu nazw zmiennych, takich jakidxTask
,idxAnotherTask
iidxSubTask
etc.Lub przynajmniej podwojenie pierwszej litery tablicy, którą indeksuje, np.
ss
Do indeksowaniasubjectList
,tt
do indeksowaniataskList
, ale nieii
lubjj
co nie pomaga mi bez wysiłku zidentyfikować, którą tablicę indeksują z moich wielokrotnych pętli for.źródło
Domyślnie
i
ij
oznacza wyimaginowaną jednostkę. Zatem z punktu widzenia MATLAB-i
a używanie jako zmiennej jest w pewnym sensie podobne do używania1
jako zmiennej.źródło
i
ij
są w rzeczywistości funkcjami zwracającymi wartość jednostki urojonej. W zakresie można użyć zmiennej o tej samej nazwie, co funkcja. Będzie to jednak zaciemniać funkcję.Chyba że jesteś bardzo zdezorientowany użytkownik myślę, że istnieje bardzo małe ryzyko w użyciu nazw zmiennych I i J i używam ich regularnie. Nie widziałem żadnych oficjalnych wskazówek, że należy unikać tej praktyki.
Chociaż prawdą jest, że cieniowanie wyimaginowanej jednostki może powodować pewne zamieszanie w pewnym kontekście, jak wspomniano w innych postach, ogólnie po prostu nie uważam tego za poważny problem. W MATLAB-ie jest znacznie więcej zagmatwanych rzeczy, na przykład definiowanie
false=true
Moim zdaniem jedyny przypadek, w którym prawdopodobnie powinieneś ich unikać, to sytuacja, w której Twój kod dotyczy konkretnie liczb urojonych.
źródło
i
jest funkcją, można ją przesłonić i wykorzystać jako zmienną. Jednak najlepiej unikać używaniai
ij
dla nazw zmiennych, jeśli zamierzasz używać ich w złożonej arytmetyce”. To, w połączeniu z komentarzem Eitana T na temat odpowiedzi Olivera (myślę, że to on ustalił) wydaje się wystarczającym dowodem.