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



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

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

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

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

mat( i, j ) = 4;

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

149   9  

9 ответов:

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

как было предложено: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.

    Ничего не найдено.

Добавить ответ:
Отменить.