Использование 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иjby1i.поэтому вместо того, чтобы избегать двух очень часто используемых имен переменных из-за потенциального конфликта, я явно говорю о мнимых числах. Это также делает мой код более ясным. В любое время, когда я вижу
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когда мне нужно использовать комплексные числа.
путаница с воображаемой единицей была хорошо освещена здесь, но есть некоторые другие более прозаические причины, по которым эти и другие однобуквенные имена переменных иногда не поощряются.
MATLAB в частности: если вы используете кодер для создания источника C++ из вашего кода MATLAB (не, это ужасно), то вы явно предупреждены не использовать переменные из-за потенциальных конфликтов ввода.
Как правило, и в зависимости от вашей IDE, однобуквенное имя переменной может вызвать хаос с маркерами и поиском / заменой. MATLAB не страдает от этого, и я считаю, что у Visual Studio не было проблемы в течение некоторого времени, но стандарты кодирования C/C++, такие как MISRA и т. д. как правило, советуют снова их.
со своей стороны я избегаю всех однобуквенных переменных, несмотря на очевидные преимущества для непосредственной реализации математических источников. Это требует немного дополнительных усилий первые несколько сотен раз вы делаете это, но после то, что вы перестаете замечать, и преимущества, когда вы или какая-то другая бедная душа приходят, чтобы прочитать ваш код, легион.
по умолчанию
iиjподставка для мнимой единицы. Итак, с точки зрения MATLAB, используяiв качестве переменной-то, как с помощью1как переменная.
Если вы не очень запутанный пользователь, я думаю, что очень мало риска в использовании имен переменных Я и j и я использую их регулярно. Я не видел никаких официальных указаний на то, что этой практики следует избегать.
хотя это правда, что затенение воображаемой единицы может вызвать некоторую путаницу в некотором контексте, как упоминалось в других сообщениях, в целом я просто не вижу в этом серьезной проблемы. Есть гораздо более запутанные вещи, которые вы можете сделать в MATLAB, возьмите например, определение
false=trueна мой взгляд, единственный раз, когда вы, вероятно, должны избегать их, - это если ваш код специально имеет дело с мнимыми числами.
любой нетривиальный код содержит несколько
forциклы, и лучшие практики рекомендуют использовать описательное имя, указывающее на его назначение и область применения. Для незапамятных времен (и если его сценарий 5-10 строк, который я не собираюсь сохранять), Я всегда использовал имена переменных, такие какidxTask,idxAnotherTaskиidxSubTasketc.или, по крайней мере, удвоение первой буквы массива он индексирует, например
ssиндексsubjectList,ttиндексtaskList, но неiiилиjjчто не помогает мне легко определить, какой массив они индексируют из моих нескольких циклов for.
Comments