i
и j
являются очень популярными именами переменных (см., например, этот вопрос и этот ).
Например, в циклах:
for i=1:10,
% do something...
end
Как индексы в матрицу:
mat( i, j ) = 4;
Почему они не должны использоваться как имена переменных в Matlab?
i
,j
,k
как общие имена переменных цикла.Ответы:
Потому что
i
иj
обе функции обозначают мнимую единицу :Таким образом, переменная, вызываемая
i
илиj
переопределит их, потенциально может молча нарушить код, который выполняет сложные математические операции.Возможные решения включают использование
ii
и вjj
качестве переменных цикла вместо этого, или использование1i
всякий раз, когдаi
требуется представить мнимую единицу.источник
i
иj
.for
цикл 1 миллиард раз, не показывают статистической разницы во времени). Для всего, что мы знаем, есть специальный код для обработки именно этого, и использование переменных, отличных отi
иj
(иk
?), На самом деле немного медленнее. И различия, которые существуют, очень малы, чтобы не существовать в реальной жизни. Просто нет причин НЕ использоватьi
иj
как обычные переменные - они должны использоваться правильно, как любая другая функция Matlab.for
цикл 1 миллиард раз и пробовал всевозможные схемы синхронизации. Я вижу, что новым пользователям SO говорят, что совершенно правильный код неправильный, потому что они используютi
иj
для итерации циклов. Честно говоря, это просто глупо, и люди упускают из виду более важный пункт этого вопроса: егоi
иj
не следует даже использовать для воображаемой единицы, если кто-то хочет написать читаемый современный код Matlab.Это хорошая практика, чтобы избежать
i
иj
переменных , чтобы предотвратить путаницу их быть переменными или мнимая единица.Лично, однако, я использую
i
иj
как переменные довольно часто в качестве индекса коротких циклов. Для того, чтобы избежать проблем в моем собственном коде, я следую за другую хорошую практику в отношенииi
иj
: не использовать их для обозначения мнимых чисел. Фактически, собственная документация Matlab гласит :Таким образом, вместо того, чтобы избегать двух очень часто используемых имен переменных из-за потенциального конфликта, я явно говорю о мнимых числах. Это также делает мой код более понятным. Каждый раз, когда я вижу
1i
, я знаю, что это представляет,sqrt(-1)
потому что это не может быть переменной.источник
1i
. Однако изменение значенияi
иj
может привести к трудным для отладки ошибкам, таким как эта .i
иj
лучше всего, но объяснил, как мой личный стиль кодирования не следует этому правилу.1i
а неi
для сложной математики. Давайте подумаем о мнимом числе как о мнимом числе1i
и возьмемi
плохую практику. А не наоборот. Использованиеi
,ii
,iii
является обычной практикой в Matlab , и нет никаких проблем , когда люди придерживаются1i
и1j
для комплексного числа. Также Matlab уважает это, и это не снижает производительность (насколько я тестировал), как указано в предыдущем ответе.В старых версиях MATLAB имелись веские основания избегать использования
i
иj
в качестве имен переменных - ранние версии MATLAB JIT были не достаточно умен , чтобы сказать , были ли вы использовать их в качестве переменных или мнимых единиц, и будет , следовательно , отключите много других возможных оптимизаций.Следовательно, ваш код будет работать медленнее только благодаря наличию переменных
i
иj
как переменных, и ускорится, если вы измените их на что-то другое. Вот почему, если вы прочитаете большую часть кода MathWorks, вы увидитеii
иjj
довольно широко будете использовать его в качестве индексов цикла. Некоторое время MathWorks, возможно, даже неофициально советовал людям делать это самостоятельно (хотя они всегда официально советуют людям программировать на элегантность / ремонтопригодность, а не на то, что делает текущий JIT, поскольку это движущаяся цель для каждой версии).Но это довольно давно, и в настоящее время это проблема «зомби», которая на самом деле гораздо менее важна, чем многие все еще думают, но отказывается умирать.
В любой недавней версии, это действительно личное предпочтение, использовать
i
илиj
как имена переменных или нет. Если вы много работаете с комплексными числами, вы можете избегатьi
иj
как переменные, чтобы избежать любого небольшого потенциального риска путаницы (хотя вы также можете / вместо этого захотеть использовать только1i
или1j
для еще меньшей путаницы и немного повысить производительность ).С другой стороны, в моей типичной работе я никогда не имею дело с комплексными числами, и я считаю, что мой код более читабелен, если я чувствую себя свободным в использовании
i
и вj
качестве индексов цикла.Я вижу здесь много ответов, в которых говорится, что это не рекомендуется ... не говоря, кто делает это, рекомендуя. Вот степень фактических рекомендаций MathWorks из текущей документации для
i
:источник
Как описано в других ответах, использование
i
общего кода не рекомендуется по двум причинам:Как предлагается:
1i
иii
рекомендуется. Однако, несмотря на то, что оба они являются отличными отклонениямиi
, не очень хорошо использовать обе эти альтернативы вместе.Вот пример, почему (лично) мне это не нравится:
Один не легко будет неверно истолкован для двух или трех, но два и три напоминают друг друга.
Поэтому моя личная рекомендация такова: если вы иногда работаете со сложным кодом, всегда используйте в
1i
сочетании с другой переменной цикла.Примеры отдельных индексов буквенных что , если вы не используете много переменных цикла и будет достаточно для писем:
t
,u
,k
иp
Пример длинных индексов:
i_loop
,step
,walk
, иt_now
Конечно, это также вопрос личного вкуса, но не должно быть трудно найти индексы для использования, которые имеют четкое значение, но не растут слишком долго.
источник
1i
будет по-разному окрашен как число :)doc i
иdoc j
: «Для увеличения скорости и надежности вы можете заменить комплекс i и j на 1i». ИМО, в нынешнем Matlab нет причин не использоватьi
иj
в циклах и т. Д., Или использовать что-либо, кроме1i
обозначения мнимой единицы (1j
работает тоже). Единственное исключение - при передаче строк в слегка несовместимый символьный движок. Странно , чтоhelp 1i
иdoc 1i
не работать , хотя.Было отмечено, что
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
когда мне нужно использовать комплексные числа.источник
1i
иii
» И даже больше разницу между1
иl
и междуO
и0
. Вот почему первый шаг в новой установке MATALB - это изменение размера шрифта по умолчанию.Путаница с мнимой единицей здесь хорошо освещена, но есть и другие более прозаические причины, почему эти и другие однобуквенные имена переменных иногда не поощряются.
В частности, для MATLAB: если вы используете кодер для генерации исходного кода C ++ из своего кода MATLAB (не ужасно), то вам явно предупреждают, что не следует повторно использовать переменные из-за возможных типографских конфликтов.
Как правило, и в зависимости от вашей IDE, однобуквенное имя переменной может привести к хаосу с подсветкой и поиском / заменой. MATLAB не страдает от этого, и я считаю, что Visual Studio не имела проблем в течение некоторого времени, но стандарты кодирования C / C ++, такие как MISRA и т. Д., Как правило, рекомендуют их снова.
Я, со своей стороны, избегаю всех однобуквенных переменных, несмотря на очевидные преимущества прямой реализации математических источников. Первые несколько сотен раз, когда вы делаете это, требуется немного дополнительных усилий, но после этого вы перестаете замечать, и преимущества, когда вы или какая-то другая бедная душа приходят читать ваш код, легион.
источник
Любой нетривиальный код содержит несколько
for
циклов, и лучшие практики рекомендуют использовать описательное имя, указывающее его назначение и область применения. Для незапамятных времен (и если его 5-10 строк сценария , что я не собираюсь спасать), я всегда использую имена переменных , какidxTask
,idxAnotherTask
иidxSubTask
т.д.Или, по крайней мере, удвоение первой буквы массива, который он индексирует, например,
ss
индексироватьsubjectList
,tt
индексироватьtaskList
, но неii
илиjj
который не помогает мне легко определить, какой массив они индексируют из моего кратного цикла for.источник
По умолчанию
i
иj
обозначают мнимый блок. Таким образом, с точки зрения MATLAB, использованиеi
в качестве переменной похоже на использование1
в качестве переменной.источник
i
Иj
фактически функция , возвращающее значение мнимой единицы. Можно использовать переменную с тем же именем, что и функция в области видимости. Это однако затеняет функцию.Если вы не очень запутанный пользователь, я думаю, что использовать имена переменных i и j очень мало, и я использую их регулярно. Я не видел никаких официальных указаний на то, что этой практики следует избегать.
Хотя это правда, что слежка за мнимой единицей может вызвать некоторую путаницу в каком-то контексте, как упоминалось в других постах, в целом я просто не рассматриваю это как главную проблему. Есть много более запутанных вещей, которые вы можете сделать в MATLAB, например, определение
false=true
По моему мнению, единственный раз, когда вы, вероятно, должны избегать их, это если ваш код специально работает с воображаемыми числами.
источник
i
это функция, ее можно переопределить и использовать в качестве переменной. Однако лучше избегать использованияi
иj
для имен переменных, если вы собираетесь использовать их в сложной арифметике». Это, в сочетании с комментарием Эйтана Т на ответ Оливера (я полагаю, он рассчитал это), кажется достаточным доказательством.