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як загальні імена змінних циклу.