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

для скорости и улучшенной надежности вы можете заменить complex i и j by 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 является функцией, ее можно переопределить и использовать в качестве переменной. Однако лучше избегать использования i и j для имен переменных, если вы собираетесь использовать их в сложной арифметике. [...] Для скорости и улучшенной надежности вы можете заменить комплекс i и j на 1i.


как описано в других ответах, использование i вообще код не рекомендуется по двум причинам:

  • если вы хотите использовать мнимое число, его можно спутать или перезаписать индексом
  • если вы используете его в качестве индекса, он может overwite или путать с мнимой номером

как предложил: 1i и есть. Однако, хотя это оба прекрасные отклонения от 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. Но опять же, как заметил Деннис (https://stackoverflow.com/a/14893729/1967396), может быть трудно увидеть разницу между 1i и ii. Мое предложение: используйте 1j как мнимая постоянная, где это возможно. Это тот же трюк, который используют инженеры-электрики-они используют j на sqrt(-1) потому что i уже за настоящее.

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


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

  1. MATLAB в частности: если вы используете кодер для генерации источника C++ из вашего кода MATLAB (не, это ужасно), то вас явно предупреждают не использовать переменные из-за потенциальных столкновений типов.

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

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


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


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

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

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


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

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