Использование i и j в качестве переменных в Matlab
i
а также j
очень популярные имена переменных (см., например, этот вопрос и этот).
Например, в циклах:
for i=1:10,
% do something...
end
Как индексы в матрицу:
mat( i, j ) = 4;
Почему они не должны использоваться как имена переменных в Matlab?
9 ответов
Так как i
а также j
Обе функции обозначают мнимую единицу:
Так что переменная называется i
или же j
переопределит их, потенциально молча нарушая код, который выполняет сложные математические операции.
Возможные решения включают использование ii
а также jj
в качестве переменных цикла вместо этого, или используя 1i
всякий раз, когда i
требуется представлять мнимую единицу.
Это хорошая практика, чтобы избежать i
а также j
переменные, чтобы избежать путаницы по поводу того, что они являются переменными или мнимой единицей.
Лично, однако, я использую i
а также j
в качестве переменных довольно часто, как индекс коротких циклов. Чтобы избежать проблем в моем собственном коде, я следую другой хорошей практике относительно i
а также j
: не используйте их для обозначения мнимых чисел. Фактически, собственная документация Matlab гласит:
Для скорости и повышения надежности вы можете заменить комплекс
i
а такжеj
от1i
,
Таким образом, вместо того, чтобы избегать двух очень часто используемых имен переменных из-за потенциального конфликта, я явно говорю о мнимых числах. Это также делает мой код более понятным. В любое время я вижу 1i
Я знаю, что это представляет sqrt(-1)
потому что это не может быть переменной.
В старых версиях MATLAB имелась веская причина избегать использования i
а также j
как имена переменных - ранние версии MATLAB JIT не были достаточно умны, чтобы определить, использовали ли вы их как переменные или как мнимые единицы, и, следовательно, отключили бы многие другие возможные оптимизации.
Ваш код, следовательно, станет медленнее только благодаря самому присутствию i
а также j
в качестве переменных, и ускорится, если вы измените их на что-то другое. Вот почему, если вы прочитаете много кода MathWorks, вы увидите ii
а также jj
довольно широко используется в качестве петлевых индексов. Некоторое время MathWorks, возможно, даже неофициально советовал людям делать это самостоятельно (хотя они всегда официально советуют людям программировать на элегантность / удобство обслуживания, а не на то, что делает текущий JIT, так как это движущаяся цель для каждой версии).
Но это довольно давно, и в настоящее время это проблема "зомби", которая на самом деле гораздо менее важна, чем многие все еще думают, но отказывается умирать.
В любой недавней версии это действительно личное предпочтение, использовать ли i
а также j
как имена переменных или нет. Если вы много работаете со сложными числами, вы можете избежать i
а также j
в качестве переменных, чтобы избежать любого потенциального риска путаницы (хотя вы также можете / вместо этого использовать только 1i
или же 1j
для еще меньшей путаницы и немного лучшей производительности).
С другой стороны, в моей типичной работе я никогда не имею дело со сложными числами, и я нахожу свой код более читабельным, если я чувствую себя свободным в использовании i
а также j
как циклические индексы.
Я вижу здесь много ответов, в которых говорится, что это не рекомендуется... не говоря, кто делает это, рекомендуя. Вот степень фактических рекомендаций MathWorks, из текущей версии документации для 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
Конечно, это также вопрос личного вкуса, но не должно быть трудно найти индексы для использования, которые имеют четкое значение, но не растут слишком долго.
Было отмечено, что 1i
является приемлемым и однозначным способом записи sqrt(-1)
и что как таковой нет необходимости избегать использования i
, С другой стороны, как отметил Деннис ( /questions/33558477/ispolzovanie-i-i-j-v-kachestve-peremennyih-v-matlab/33558480#33558480), может быть трудно увидеть разницу между 1i
а также ii
, Мое предложение: использовать 1j
как мнимая константа, где это возможно. Это тот же трюк, который используют инженеры-электрики - они используют j
за sqrt(-1)
так как i
уже принято за ток.
Лично я никогда не пользуюсь i
а также j
; я использую ii
а также jj
в качестве сокращенных индексных переменных (и kk, ll, mm, ...) и 1j
когда мне нужно использовать комплексные числа.
Путаница с мнимой единицей здесь хорошо освещена, но есть и другие более прозаические причины, почему эти и другие однобуквенные имена переменных иногда не поощряются.
В частности, для MATLAB: если вы используете кодер для генерации исходного кода C++ из вашего кода MATLAB (не ужасно), тогда вам явно предупреждают, что не следует повторно использовать переменные из-за возможных столкновений типов.
Как правило, и в зависимости от вашей IDE, однобуквенное имя переменной может привести к хаосу с подсветкой и поиском / заменой. MATLAB не страдает от этого, и я считаю, что Visual Studio не имела проблем в течение некоторого времени, но стандарты кодирования C/C++, такие как MISRA и т. Д., Как правило, рекомендуют их снова.
Я, со своей стороны, избегаю всех однобуквенных переменных, несмотря на очевидные преимущества прямой реализации математических источников. Первые несколько сотен раз, когда вы делаете это, требуется немного дополнительных усилий, но после этого вы перестаете замечать, и преимущества, когда вы или какая-то другая бедная душа приходят, чтобы прочитать ваш код, легион.
Любой нетривиальный код содержит несколько for
Циклы и лучшие практики рекомендуют использовать описательное имя, указывающее его назначение и область применения. В незапамятные времена (и если я не собираюсь сохранять сценарий из 5-10 строк, я всегда использовал такие имена переменных, как idxTask
, idxAnotherTask
а также idxSubTask
и т.п.
Или, по крайней мере, удвоение первой буквы массива, который он индексирует, например ss
индексировать subjectList
, tt
индексировать taskList
, но нет ii
или же jj
что не помогает мне легко определить, какой массив они индексируют из моего множества для циклов for.
По умолчанию i
а также j
стоять за воображаемую единицу. Таким образом, с точки зрения MATLAB, используя i
в качестве переменной как-то похоже на использование 1
как переменная.
Если вы не очень запутанный пользователь, я думаю, что использовать имена переменных i и j очень мало, и я использую их регулярно. Я не видел никаких официальных указаний на то, что этой практики следует избегать.
Хотя это правда, что слежка за мнимой единицей может вызвать некоторую путаницу в каком-то контексте, как упоминалось в других постах, в целом я просто не рассматриваю это как главную проблему. Есть много более запутанных вещей, которые вы можете сделать в MATLAB, например, определение false=true
По моему мнению, единственный раз, когда вы, вероятно, должны избегать их, это если ваш код специально работает с воображаемыми числами.
Потому что я и j по умолчанию мнимые единицы. Если вы назначите i и j другие значения, значение по умолчанию будет перезаписано. Это может вызвать путаницу. Однако, хороший способ избежать этого - использовать 1i и 1j в качестве мнимых единиц. В общем, вы можете использовать ni и nj для представления мнимых чисел.
Например:
>> i
ans =
0.0000 + 1.0000i
>> i=2
i =
2
>> 1i
ans =
0.0000 + 1.0000i