2013-02-09 2 views
116

и j - очень популярные имена переменных (см., Например, this question и this one).Использование переменных i и j в Matlab

Например, в петлях:

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

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

mat(i, j) = 4; 

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

+4

Конечно, я не буду отмечать это как таковое, но, судя по ответам, я бы сказал, что это «основано прежде всего на мнениях». ;-) Я лично не отказался бы от 'i',' j', 'k' как общих имен переменных цикла. –

+1

@ A.Donda, это ваше ** ваше мнение;) – Shai

+0

@Shai, это ваше последнее предложение в этом вопросе: «Почему они не должны использоваться в качестве переменных имен в Matlab?» Так что непонятно, почему вы отклоняете мое издание на свой вопрос ?! Я изменил свой заголовок на более конструктивный заголовок [«Почему не следует использовать i и j в качестве переменных в Matlab»] (http://stackoverflow.com/review/spected-edits/13138842) –

ответ

155

Поскольку i и j являются функции, обозначающие imaginary unit:

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

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

+35

Также стоит отметить, что даже если вы ничего не нарушаете, время исполнения по-прежнему приносится в жертву, чтобы разрешить имена переменных 'i' и' j'. –

+13

@Eitan: Можете ли вы на самом деле поддержать это каким-либо конкретным убедительным способом в JIT-компиляционной версии Matlab? Я никогда не обнаружил, что это так (и простые тесты, вызывающие цикл 'for' 1 миллиард раз, не показывают статистической разницы во времени). Для всех, кого мы знаем, есть специальный код для обработки именно этого и использование переменных, отличных от 'i' и' j' (и 'k'?), На самом деле немного медленнее. И различия, которые существуют, минимальны, чтобы не существовать в реальной жизни. Просто нет причин НЕ использовать 'i' и' j' в качестве обычных переменных - их просто нужно использовать должным образом, как и любая другая функция Matlab. – horchler

+5

@horchler Ну, официальные документы указывают [здесь] (http://goo.gl/risIl), что переопределение стандартных классов данных MATLAB «может отрицательно повлиять на производительность» и [здесь] (http://goo.gl/bzQ9a) подразумевается, чтобы избежать переопределения сложных констант по причинам скорости, а также надежности. В [более старых документах R2009b] (http://goo.gl/PVwFk) явно рекомендуется отказаться от переопределения сложных констант, так как это может помешать ускорению JIT. Разрешение имен переменных может быть незначительным, но оно может быть значительным, если повторять миллионы раз. –

1

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

+4

Я не думаю, что это совсем так , i является законным именем переменной, поэтому вы можете фактически использовать i и j в качестве имен переменных. он, как говорится в предыдущем ответе, маскирует воображаемый смысл. 1 не является законным именем переменной. это совершенно нормально, если вы никогда не используете сложные номера. – thang

+0

@thang вот почему я сказал «как-то вроде», а не «как». Я знаю, что есть разница. OP спросил, почему их не следует использовать, я попытался объяснить, что это потому, что они уже выражают число. –

+2

ОК, извините, я не знаю, что * как-то вроде * означает. для меня это явно отличается, потому что хорошо, вы не можете использовать 1 как переменную, даже если хотите ... но я вижу, откуда вы. – thang

55

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

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

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

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

+2

Действительно, рекомендуется использовать' 1i'. Однако изменение значения 'i' и' j' может привести к ошибкам с отладки, такими как [этот] (http://www.stackoverflow.com/questions/13860222/what-is-complex-scalar -типа-недействительна-а-индекс-значение). – Shai

+1

@Shai Хорошая точка. Я подправил свой ответ, чтобы признать, что избегать «i' и« j »лучше, но объяснил, как мой личный стиль кодирования не соответствует этому правилу. – shoelzer

+1

Обратите внимание, что указанная скорость не очень значительна: http://stackoverflow.com/questions/18163454/more-on-using-i-and-j-as-variables-in-matlab-speed –

14

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

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

Как было предложено: 1i и ii рекомендуются. Однако, хотя это и точные отклонения от i, неплохо использовать обе эти альтернативы вместе.

Вот пример, почему (лично) мне не нравится:

val2 = val + i % 1 
val2 = val + ii % 2 
val2 = val + 1i % 3 

Не будет легко неверно истолкован в течение двух или трех, а два и три напоминают друг друга.

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

Примеров отдельных буквенных индексов, что, если вы не используете много переменного цикл и буквы хватает: t, u, k и p

Примера из длинных индексов: i_loop, step, walk и t_now

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

+1

1i обозначает мнимую единицу (также имена переменных Matlab не могут начинаться с числа) – lib

+2

@DennisJaheruddin: бесстыдный плагин: используйте подсветку синтаксиса MATLAB [usercript] (https://github.com/amroamroamro/prettify-matlab/raw /master/js/prettify-matlab.user.js) для переполнения стека. В последнем примере '1i' будет по-разному окрашен как номер :) – Amro

+2

Прямо от' doc i' и 'doc j':« Для скорости и повышенной надежности вы можете заменить сложные i и j на 1i ». IMO, в текущем Matlab нет причин не использовать циклы 'i' и' j' и т. Д., Или использовать что-либо, кроме '1i', для обозначения мнимой единицы (тоже работает' 1j'). Единственное исключение - передача строк в всегда-слегка-несовместимый символический движок. Странно, что 'help 1i' и' doc 1i' не работают. – horchler

11

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

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

+2

«может быть трудно увидеть разницу между« 1i »и« ii ». И тем более разница между« 1 »и« l »и между« O »и« 0 ». Вот почему первый шаг, который я делаю в новой установке MATALB, - это изменение размера шрифта по умолчанию. – glglgl

26

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

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

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

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

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


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

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

5

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

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

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

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

2

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

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

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

+0

Не могли бы вы прокомментировать при голосовании. Например, с помощью ссылки Mathworks, указывающей, что эта практика не рекомендуется (что было указано несколькими плакатами без ссылки на какое-либо официальное руководство). Фактически использование «i» в циклах используется в официальных примерах Mathworks. По моему опыту он делает код понятным и кратким и очень распространенной практикой. – gregswiss

+0

Ссылаясь на [documentation] (http://mathworks.com/help/matlab/ref/i.html?s_tid=srchtitle) «Поскольку' i' является функцией, ее можно переопределить и использовать как переменную. лучше избегать использования 'i' и' j' для имен переменных, если вы собираетесь использовать их в сложной арифметике. " Это, в сочетании с комментарием Эйтана Т на ответ Оливера (я думаю, он приурочил его), кажется достаточным доказательством. – Adriaan

+0

Также обратите внимание, что уже существует [ответ с 2013 года] (http: // stackoverflow.com/a/17723167/5067311) с комментарием, упомянутым @Adriaan. –

2

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

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

Смежные вопросы