i
і j
є дуже популярними назвами змінних (див. наприклад, це питання і це ).
Наприклад, у циклі:
for i=1:10,
% do something...
end
Як показники в матрицю:
mat( i, j ) = 4;
Чому їх не слід використовувати як імена змінних у Matlab?
i
і j
є дуже популярними назвами змінних (див. наприклад, це питання і це ).
Наприклад, у циклі:
for i=1:10,
% do something...
end
Як показники в матрицю:
mat( i, j ) = 4;
Чому їх не слід використовувати як імена змінних у Matlab?
Відповіді:
Тому що i
і j
обидві функції позначають уявну одиницю :
Таким чином, названа змінною i
або j
їх перекриє, потенційно мовчки порушуючи код, який робить складну математику.
Можливі рішення включають в себе замість цього ii
і jj
як змінні циклу, або використання1i
коли i
потрібно для представлення уявної одиниці.
i
і j
змінних.
for
цикл в 1 мільярд разів, не показують статистичної різниці в термінах). Для всіх, що ми знаємо, існує спеціальний код для вирішення саме цього, а використання змінних, відмінних від i
та j
(і k
?), Насправді трохи повільніше. І відмінності, які існують, є мізерними до неіснуючих в реальному житті. Просто немає причин НЕ використовувати i
і j
як звичайні змінні - їх просто потрібно використовувати належним чином, як і будь-яку іншу функцію Matlab.
for
цикл в 1 мільярд разів і намагався всілякі схеми синхронізації. Я бачу, як нові користувачі SO розповідають, що абсолютно дійсний код неправильний, оскільки вони використовують i
і j
повторюють цикли. Відверто кажучи , це просто нерозумно , і люди пропали безвісти понад важливий момент цього питання: що i
і j
не повинні використовуватися навіть для уявної одиниці , якщо один хоче , щоб написати читається сучасний код Matlab.
Це хороша практика , щоб уникнути i
і j
змінних , щоб запобігти плутанині їх бути змінними або уявна одиниця.
Особисто я, однак, використовую i
і j
як змінні досить часто, як індекс коротких циклів. Для того, щоб уникнути проблем в моєму власному коді, я дотримуюся за іншу хорошу практику в відношенні i
і j
: НЕ використовувати їх для позначення уявних чисел. Насправді у власній документації Matlab зазначено :
Для швидкості та покращеної надійності ви можете замінити складні
i
таj
на1i
.
Тому замість того, щоб уникати двох найчастіше використовуваних імен змінних через потенційний конфлікт, я чітко кажучи про уявні числа. Це також робить мій код більш зрозумілим. Щоразу, коли я бачу 1i
, я знаю, що це являє собою, sqrt(-1)
тому що він не міг би бути змінною.
i
і j
найкраще, але пояснив, як мій особистий стиль кодування не відповідає цьому правилу.
1i
а не i
для складної математики. Давайте подумаємо як уявне число 1i
і візьмемо i
як уявне число погану практику. Не навпаки. Використання i
, ii
, iii
є звичайною практикою в Matlab , і немає ніяких проблем , коли люди дотримуються 1i
і 1j
для комплексного числа. Також Matlab поважає це, і це не знижує продуктивність (наскільки я тестував), як сказано в попередній відповіді.
У старих версіях MATLAB раніше були вагомі причини уникати використання i
таj
в якості імен змінних - ранні версії MATLAB JIT були досить розумний , щоб сказати , чи були ви використовувати їх в якості змінних або уявних одиниць, і буде , отже , вимкніть багато можливих оптимізацій.
Тому ваш код стане повільнішим саме через наявність i
і j
як змінні, і прискориться, якби ви змінили їх на щось інше. Ось чому, якщо ви прочитаєте багато коду MathWorks, ви побачите ii
і jj
використовуєте досить широко в якості індексів циклу. На деякий час MathWorks, можливо, навіть неофіційно радив людям робити це самостійно (хоча вони завжди офіційно радять людям програмувати на елегантність / ремонтопридатність, а не на те, що робить поточний JIT, оскільки це рухома ціль кожної версії).
Але це досить давно, і сьогодні це дещо "зомбі" питання, яке насправді набагато менш важливе, ніж багато людей досі думають, але відмовляється померти.
У будь-якій останній версії, це дійсно особисті переваги, використовувати i
чи j
як імена змінних чи ні. Якщо ви багато працюєте зі складними номерами, можливо, ви хочете уникати i
і j
як змінних, щоб уникнути будь-якого невеликого потенційного ризику плутанини (хоча ви також можете / натомість хочете використовувати лише 1i
або 1j
для ще меншої плутанини, і трохи кращу ефективність ).
З іншого боку, у своїй типовій роботі я ніколи не маю справу зі складними числами, і я вважаю свій код більш читабельним, якщо я почуваюся вільним у використанні i
та j
в якості циклівних індексів.
Я бачу тут багато відповідей, які говорять, що це не рекомендується ... не кажучи, хто це робить, рекомендуючи. Ось ступінь актуальних рекомендацій MathWorks з поточної документації на випуск для i
:
Оскільки i є функцією, її можна переосмислити і використовувати як змінну. Однак найкраще уникати використання i та j для імен змінних, якщо ви маєте намір використовувати їх у складній арифметиці. [...] Для швидкості та покращеної надійності ви можете замінити складні i та j на 1i.
Як описано в інших відповідях, використання i
загального коду не рекомендується з двох причин:
Як пропонується: 1i
і ii
рекомендуються. Однак, хоч і обидва відхилення від них i
, не дуже приємно використовувати обидві ці альтернативи разом.
Ось приклад, чому мені (особисто) це не подобається:
val2 = val + i % 1
val2 = val + ii % 2
val2 = val + 1i % 3
Один не буде легко помилитися на двох-трьох, але два і три нагадують один одного.
Тому моєю особистою рекомендацією було б: У випадку, якщо ви іноді працюєте зі складним кодом, завжди використовуйте 1i
комбіновану з різною змінною циклу.
Приклади окремих індексів буквених що , якщо ви не використовуєте багато змінних циклу і буде досить для листів: t
, u
, k
іp
Приклад довгих індексів: i_loop
, step
, walk
, іt_now
Звичайно, це також питання особистого смаку, але не повинно бути важким знайти індекси, які мають чітке значення, не надто довго зростаючи.
doc i
та doc j
: "Для швидкості та покращеної надійності ви можете замінити складні i та j на 1i." IMO, в поточному Matlab немає причин не використовувати i
і j
в циклі тощо, або використовувати щось інше, ніж 1i
для позначення уявної одиниці (також 1j
працює). Єдиний виняток - це передавання рядків у завжди трохи несумісний двигун Symbolic. Дивно, help 1i
але doc 1i
це не працює.
Було зазначено, що 1i
це прийнятний та однозначний спосіб написання sqrt(-1)
, і що як такого немає необхідності уникати використання i
. Потім, як зазначав Денніс ( https://stackoverflow.com/a/14893729/1967396 ), може бути важко помітити різницю між 1i
і ii
. Моя пропозиція: використовуйте 1j
як уявну константу, де це можливо. Це той самий трюк, який використовують інженери-електрики - вони використовують j
для того, sqrt(-1)
що i
вже прийнято за струм .
Особисто я ніколи не використовую i
і j
; Я використовую ii
і jj
як скорочену змінну індексації (і kk, ll, mm, ...), і 1j
коли мені потрібно використовувати складні числа.
1i
і ii
" І тим більше різницю між 1
і l
і між O
і 0
. Ось чому перший крок, який я роблю в новій установці MATALB, - це зміни розміру шрифту за замовчуванням.
Плутанина з уявною одиницею тут добре висвітлена, але є деякі інші більш прозаїчні причини, чому ці та інші однобуквені назви змінних іноді не перешкоджають.
MATLAB конкретно: якщо ви використовуєте кодер для створення джерела C ++ зі свого коду MATLAB (не варто, це жахливо), тоді вас явно попереджають не використовувати повторно змінні через потенційні введення стилів.
Як правило, і залежно від вашої IDE, однобуквене ім’я змінної може спричинити загрозу виділенням і пошуку / заміни. MATLAB не страждає від цього, і я вважаю, що Visual Studio вже не має проблем протягом певного часу, але стандарти кодування C / C ++, такі як MISRA тощо, як правило, не рекомендують їм ознайомитися.
Зі свого боку я уникаю всіх однобуквенних змінних, незважаючи на очевидні переваги безпосередньо впровадження математичних джерел. Перших декількох сотень разів вам потрібно докласти додаткових зусиль, але після цього ви перестаєте помічати, і переваги, коли ви або якась інша бідна душа приходить прочитати ваш код, - легіон.
Будь-який нетривіальний код містить декілька for
циклів, а найкращі практики рекомендують використовувати описову назву, що вказує на її призначення та сферу застосування. Для незапам'ятних часів (і якщо його 5-10 рядків сценарію , що я не збираюся рятувати), я завжди використовую імена змінних , як idxTask
, idxAnotherTask
і idxSubTask
т.д.
Або щонайменше подвоєння першої літери масиву, яку він індексує, наприклад, ss
для індексації subjectList
, tt
індексації taskList
, але ні ii
абоjj
це не допомагає мені без особливих зусиль визначити, який масив вони індексують з мого множини для циклів.
За замовчуванням i
і j
позначайте уявну одиницю. Отже, з точки зору MATLAB, використовувати i
як змінну так чи інакше, як використовувати 1
як змінну.
i
і j
є насправді, що повертають значення уявної одиниці. Можна використовувати змінну з тим же ім'ям, що і функція в області. Однак це затінить функцію.
Якщо ви не дуже збентежений користувачем Я думаю , що є дуже мало ризику у використанні імен змінних I і J , і я використовую їх на регулярній основі . Я не бачив жодних офіційних ознак того, що слід уникати цієї практики.
Хоча це правда, що затінення уявної одиниці може спричинити певну плутанину в якомусь контексті, як згадується в інших публікаціях, загалом я просто не вважаю це головним питанням. Є набагато більше заплутаних речей, які ви можете зробити в MATLAB, наприклад, визначившисьfalse=true
На мою думку, єдиний час, коли ви, ймовірно, повинні їх уникати, якщо ваш код спеціально має уявні числа.
i
це функція, вона може бути подолана і використовується в якості змінного. Тим НЕ менше, краще уникати використання i
і j
для імен змінних , якщо ви збираєтеся використовувати їх в складних арифметичних діях .» Це, у поєднанні з коментарем Ейтана Т на відповідь Олівера (я думаю, він приурочив) здається достатнім доказом.
i
,j
,k
як загальні імена змінних циклу.