i
y j
son nombres de variables muy populares (ver, por ejemplo, esta pregunta y esta ).
Por ejemplo, en bucles:
for i=1:10,
% do something...
end
Como índices en matriz:
mat( i, j ) = 4;
¿Por qué no deberían usarse como nombres de variables en Matlab?
i
,j
,k
como los nombres de las variables de bucle genéricos.Respuestas:
Porque
i
yj
ambas son funciones que denotan la unidad imaginaria :Entonces, una variable los llamó
i
oj
los anulará, potencialmente rompiendo silenciosamente el código que hace cálculos matemáticos complejos.Las posibles soluciones incluyen usar
ii
yjj
como variables de bucle, o usar1i
siempre quei
sea necesario para representar la unidad imaginaria.fuente
i
yj
variables.for
bucle mil millones de veces no muestran diferencias estadísticas en el tiempo). Por lo que sabemos, hay un código especial para manejar exactamente esto y el uso de variables que no seani
yj
(yk
?) Es en realidad un poco más lento. Y las diferencias que existen son minúsculas a inexistentes en la vida real. Simplemente no hay razón para NO usari
yj
como variables regulares, solo tienen que usarse correctamente como cualquier otra función de Matlab.for
bucle mil millones de veces y al intentar todo tipo de esquemas de temporización. Veo a nuevos usuarios de SO que se les dice que un código perfectamente válido está mal porque están usandoi
yj
para iterar bucles. Francamente, es una tontería y la gente se está perdiendo el punto más importante de esta pregunta: esoi
yj
ni siquiera debería usarse para la unidad imaginaria si uno quiere escribir código legible de Matlab moderno.Es una buena práctica evitar
i
yj
variables para evitar la confusión acerca de que sean variables o la unidad imaginaria.Personalmente, sin embargo, uso
i
yj
como variables con bastante frecuencia como el índice de bucles cortos. Para evitar problemas en mi propio código, sigo otra buena práctica con respecto ai
yj
: no use para denotar números imaginarios. De hecho, la propia documentación de Matlab establece :Entonces, en lugar de evitar dos nombres de variables muy utilizados debido a un conflicto potencial, soy explícito sobre los números imaginarios. También hace que mi código sea más claro. Cada vez que veo
1i
, sé que representasqrt(-1)
porque posiblemente no podría ser una variable.fuente
1i
. Sin embargo, cambiar el significado dei
yj
puede conducir a errores difíciles de depurar como este .i
yj
es mejor, pero expliqué cómo mi estilo de codificación personal no sigue esa regla.1i
y noi
para matemáticas complejas. Pensemos en el número imaginario como1i
y tomemosi
como número imaginario una mala práctica. No de la otra manera. El uso dei
,ii
,iii
es una práctica común en Matlab y no hay ningún problema cuando las personas se adhieren a1i
y1j
de los números complejos. También Matlab respeta esto y este no disminuye el rendimiento (por lo que probé) como se indicó en la respuesta anterior.En versiones anteriores de MATLAB, solía haber una buena razón para evitar el uso de
i
yj
como nombres de variables: las primeras versiones de MATLAB JIT no eran lo suficientemente inteligentes como para saber si las estaba usando como variables o como unidades imaginarias, y por lo tanto apague muchas optimizaciones posibles.Por lo tanto, su código se volvería más lento por la sola presencia de
i
yj
como variables, y se aceleraría si los cambiara a otra cosa. Es por eso que, si lee mucho código de MathWorks, veráii
yjj
usará bastante ampliamente como índices de bucle. Por un tiempo, MathWorks podría incluso haber aconsejado extraoficialmente a las personas que lo hicieran ellos mismos (aunque siempre aconsejan oficialmente a las personas que programen por elegancia / mantenimiento en lugar de lo que sea que haga el JIT actual, ya que es un objetivo móvil en cada versión).Pero eso fue hace mucho tiempo, y hoy en día es un problema de "zombie" que es mucho menos importante de lo que mucha gente todavía piensa, pero se niega a morir.
En cualquier versión reciente, es realmente una preferencia personal si usar
i
yj
como nombres de variables o no. Si hace mucho trabajo con números complejos, puede evitari
y,j
como variables, evitar cualquier pequeño riesgo potencial de confusión (aunque también puede / solo desea usar1i
o,1j
para menos confusión, y un rendimiento un poco mejor). )Por otro lado, en mi trabajo típico nunca trato con números complejos, y encuentro que mi código es más legible si me siento libre de usar
i
yj
como índices de bucle.Veo muchas respuestas aquí que dicen que no se recomienda ... sin decir quién está haciendo esa recomendación. Aquí está el alcance de las recomendaciones reales de MathWorks, de la documentación de la versión actual para
i
:fuente
Como se describe en otras respuestas, el uso del
i
código general no se recomienda por dos razones:Como se sugiere:
1i
yii
se recomiendan. Sin embargo, aunque ambas son desviaciones finasi
, no es muy bueno usar ambas alternativas juntas.Aquí hay un ejemplo de por qué (personalmente) no me gusta:
Uno no será fácilmente leído mal por dos o tres, pero dos y tres se parecen entre sí.
Por lo tanto, mi recomendación personal sería: en caso de que a veces trabaje con código complejo, use siempre
1i
combinado con una variable de bucle diferente.Ejemplos de índices de una sola letra que por si no hace uso de muchas variables de bucle y son suficientes letras:
t
,u
,k
yp
Ejemplo de los índices más largos:
i_loop
,step
,walk
, yt_now
Por supuesto, esto también es una cuestión de gusto personal, pero no debería ser difícil encontrar índices para usar que tengan un significado claro sin crecer demasiado.
fuente
1i
tendrá un color diferente como número :)doc i
ydoc j
: "Para velocidad y robustez mejorada, puede reemplazar complejos i y j por 1i". En mi opinión, en Matlab actual no hay razón para no usari
yj
en bucles, etc., o para usar otra cosa que no sea1i
denotar la unidad imaginaria (1j
también funciona). La única excepción es cuando pasa cadenas al motor simbólico siempre ligeramente incompatible. Extraño esohelp 1i
ydoc 1i
no funciona sin embargo.Se señaló que
1i
es una forma aceptable y no ambigua de escribirsqrt(-1)
, y que como tal no hay necesidad de evitar el usoi
. Por otra parte, como señaló Dennis ( https://stackoverflow.com/a/14893729/1967396 ), puede ser difícil ver la diferencia entre1i
yii
. Mi sugerencia: usar1j
como la constante imaginaria donde sea posible. Es el mismo truco que emplean los ingenieros eléctricos - que utilizanj
para lasqrt(-1)
causai
ya que se da por la corriente .Personalmente nunca uso
i
yj
; Utilizoii
yjj
como variables de indexación abreviada (y kk, ll, mm, ...) y1j
cuando necesito usar números complejos.fuente
1i
yii
" Y aún más la diferencia entre1
yl
y entreO
y0
. Es por eso que el primer paso que hago en una nueva instalación de MATALB es cambiar el tamaño de fuente predeterminado.La confusión con la unidad imaginaria se ha cubierto bien aquí, pero hay algunas otras razones más prosaicas por las que a veces se desalientan estos y otros nombres de variables de una sola letra.
MATLAB específicamente: si está usando el codificador para generar una fuente C ++ a partir de su código MATLAB (no, es horrible), entonces se le advierte explícitamente que no reutilice las variables debido a posibles conflictos de tipeo.
En general, y dependiendo de su IDE, un nombre de variable de una letra puede causar estragos en los marcadores y buscar / reemplazar. MATLAB no sufre esto y creo que Visual Studio no ha tenido ningún problema por algún tiempo, pero los estándares de codificación C / C ++ como MISRA, etc. tienden a aconsejarlos.
Por mi parte, evito todas las variables de una sola letra, a pesar de las ventajas obvias para implementar directamente fuentes matemáticas. Requiere un poco de esfuerzo adicional las primeras cientos de veces que lo haces, pero después de eso dejas de notarlo, y las ventajas cuando tú o alguna otra pobre alma vienen a leer tu código son innumerables.
fuente
Cualquier código no trivial contiene múltiples
for
bucles, y las mejores prácticas recomiendan que use un nombre descriptivo indicativo de su propósito y alcance. Para tiempos inmemoriales (y menos que su guión 5-10 líneas que no voy a guardar), siempre he estado utilizando nombres de variables comoidxTask
,idxAnotherTask
yidxSubTask
etc.O al menos duplicar la primera letra de la matriz que está indexando, por ejemplo,
ss
para indexarsubjectList
,tt
para indexartaskList
, pero noii
ojj
lo que no me ayuda a identificar sin esfuerzo qué matriz están indexando de mis múltiples para bucles.fuente
Por defecto
i
yj
representa la unidad imaginaria. Entonces, desde el punto de vista de MATLAB, usari
como variable es de alguna manera como usar1
como variable.fuente
i
yj
en realidad son funciones que devuelven el valor de la unidad imaginaria. Es posible utilizar una variable con el mismo nombre como función en un ámbito. Sin embargo, esto sombreará la función.A menos que sea un usuario muy confuso, creo que hay muy poco riesgo al usar nombres de variables i y j y los utilizo con regularidad. No he visto ninguna indicación oficial de que esta práctica deba evitarse.
Si bien es cierto que sombrear la unidad imaginaria podría causar cierta confusión en algún contexto como se menciona en otras publicaciones, en general, simplemente no lo veo como un problema importante. Hay muchas cosas más confusas que puede hacer en MATLAB, por ejemplo, definir
false=true
En mi opinión, la única vez que probablemente debería evitarlos es si su código trata específicamente con números imaginarios.
fuente
i
es una función, puede anularse y usarse como una variable. Sin embargo, es mejor evitar usari
yj
para nombres de variables si tiene la intención de usarlos en aritmética compleja". Eso, junto con el comentario de Eitan T sobre la respuesta de Oliver (supongo que lo cronometró) parece una prueba suficiente.