Использование я и j в качестве переменных в Matlab

i и j - очень популярные имена переменных (см., например, этот вопрос и этот).

Например, в циклах:

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

Как индексы в матрицу:

mat( i, j ) = 4;

Почему они не должны использоваться как имена переменных в Matlab?

Ответ 1

Потому что i и j - обе функции, обозначающие мнимую единицу :

Таким образом, переменная, называемая i или j, переопределит их, потенциально бесшумно нарушая код, который выполняет сложные математические операции.

Возможные решения включают использование ii и jj в качестве переменных цикла вместо или 1i, когда i требуется для представления мнимой единицы.

Ответ 2

Рекомендуется избегать переменных i и j, чтобы предотвратить путаницу в отношении того, что они являются переменными или мнимой единицей.

Лично, однако, я часто использую i и j как переменные как индекс коротких циклов. Чтобы избежать проблем с моим собственным кодом, я следую другой хорошей практике относительно i и j: не используйте их для обозначения мнимых чисел. Фактически Соответствует собственной документации Matlab:

Для скорости и повышенной надежности вы можете заменить сложные i и j на 1i.

Поэтому вместо того, чтобы избегать двух очень часто используемых имен переменных из-за потенциального конфликта, я явно о мнимых числах. Это также делает мой код более понятным. В любое время, когда я вижу 1i, я знаю, что он представляет sqrt(-1), потому что он не может быть переменной.

Ответ 3

В старых версиях MATLAB была хорошая причина избегать использования i и j в качестве имен переменных - ранние версии MATLAB JIT были недостаточно умны, чтобы определить, используете ли вы их как переменные или как мнимые единицы, и поэтому отключит многие другие возможные оптимизации.

Таким образом, ваш код будет медленнее, просто благодаря наличию i и j в качестве переменных, и ускорится, если вы измените их на что-то другое. Поэтому, если вы прочитаете много кода MathWorks, вы увидите, что ii и jj используются довольно широко как индексы цикла. Некоторое время MathWorks могла даже неофициально советовать людям делать это сами (хотя они всегда официально советуют людям программировать на элегантность/ремонтопригодность, а не на то, что делает текущий JIT, поскольку это движущаяся цель каждой версии).

Но это довольно давно, и в настоящее время это немного проблема "зомби", которая на самом деле гораздо менее важна, чем многие люди все еще думают, но отказывается умирать.

В любой недавней версии действительно личным предпочтением является использование i и j в качестве имен переменных или нет. Если вы много работаете со сложными числами, вы можете избежать i и j в качестве переменных, чтобы избежать небольшого потенциального риска путаницы (хотя вы также можете/вместо этого хотите использовать только 1i или 1j за меньшую путаницу и немного лучшую производительность).

С другой стороны, в моей обычной работе я никогда не занимаюсь сложными числами, и я считаю, что мой код более читабельен, если я не хочу использовать i и j как индексы цикла.


Здесь я вижу много ответов, в которых говорится, что не рекомендуется... не говоря, кто это рекомендует. Здесь приведенные фактические рекомендации MathWorks из текущей документации для i:

Так как я - функция, ее можно переопределить и использовать в качестве переменной. Однако лучше избегать использования я и j для имен переменных, если вы собираетесь использовать их в сложной арифметике. [...] Для скорости и повышенной надежности вы можете заменить сложные я и j на 1i.

Ответ 4

Как описано в других ответах, использование 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

Конечно, это тоже вопрос личного вкуса, но нетрудно найти индексы для использования, которые имеют ясный смысл, не слишком долгое время.

Ответ 5

Было указано, что 1i является приемлемым и недвусмысленным способом записи sqrt(-1), и поэтому нет необходимости избегать использования i. Опять же, как указал Деннис (fooobar.com/questions/52057/...), может быть трудно увидеть разницу между 1i и ii. Мое предложение: используйте 1j как мнимую константу, где это возможно. Это тот же трюк, который используют инженеры-электрики - они используют j для sqrt(-1), потому что i уже принято для current.

Лично я никогда не использую i и j; Я использую ii и jj как сокращающие индексирующие переменные (и kk, ll, mm,...) и 1j, когда мне нужно использовать сложные числа.

Ответ 6

Путаница с воображаемой единицей была хорошо освещена здесь, но есть и другие более прозаические причины, почему эти и другие однобуквенные имена переменных иногда обескуражены.

  • MATLAB специально: если вы используете coder для генерации исходного кода С++ из вашего кода MATLAB (не так ли, это ужасно), то вы явно предупреждаетесь о том, чтобы не использовать переменные из-за потенциальных конфликтов ввода.

  • Как правило, и в зависимости от вашей IDE однобуквенное имя переменной может вызвать хаос с подсветкой и поиск/замену. MATLAB не страдает от этого, и я считаю, что Visual Studio не испытывает проблем в течение некоторого времени, но стандарты кодирования C/С++, такие как MISRA и т.д., Обычно советуют им снова.

Со своей стороны, я избегаю всех однобуквенных переменных, несмотря на очевидные преимущества для непосредственного использования математических источников. Это потребует немного дополнительных усилий в первые несколько сотен раз, когда вы это делаете, но после этого вы перестаете замечать, и преимущества, когда вы или какая-то другая бедная душа приходят читать ваш код, - это легион.

Ответ 7

По умолчанию i и j обозначают мнимую единицу. Таким образом, с точки зрения MATLAB использование i в качестве переменной как-то напоминает использование 1 в качестве переменной.

Ответ 8

Если вы не очень запутанный пользователь, я думаю, что существует очень мало рисков при использовании имен переменных я и j, и я регулярно их использую. Я не видел никаких официальных указаний на то, что этой практики следует избегать.

Хотя верно, что затенение воображаемой единицы может вызвать некоторую путаницу в каком-то контексте, как упоминалось в других сообщениях, в целом я просто не вижу в этом серьезной проблемы. Есть гораздо более запутывающие вещи, которые вы можете сделать в MATLAB, например, определение false=true

По-моему, единственный раз, когда вы, вероятно, избегаете их, - это если ваш код конкретно касается мнимых чисел.

Ответ 9

Любой нетривиальный код содержит несколько циклов for, и лучшие практики рекомендуют использовать описательное имя, указывающее его назначение и область действия. На незапамятные времена (и если его 5-10 строк script, которые я не собираюсь сохранять), я всегда использовал имена переменных, такие как idxTask, idxAnotherTask и idxSubTask и т.д.

Или, по крайней мере, удваивая первую букву массива, она индексирует, например. ss, чтобы индексировать subjectList, tt, чтобы индексировать taskList, но не ii или jj, что не помогает мне легко определить, какой массив они индексируют из моего множителя для циклов.