Использование 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
by1i
.
поэтому вместо того, чтобы избегать двух очень часто используемых имен переменных из-за потенциального конфликта, я явно говорю о мнимых числах. Это также делает мой код более ясным. В любое время, когда я вижу 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
когда мне нужно использовать комплексные числа.
путаница с мнимой единицей была хорошо освещена здесь, но есть некоторые другие, более прозаические причины, почему эти и другие однобуквенные имена переменных, иногда просто обескураживают.
MATLAB в частности: если вы используете кодер для генерации источника C++ из вашего кода MATLAB (не, это ужасно), то вас явно предупреждают не использовать переменные из-за потенциальных столкновений типов.
вообще, и в зависимости от вашей 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.