iy json 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,kcomo los nombres de las variables de bucle genéricos.Respuestas:
Porque
iyjambas son funciones que denotan la unidad imaginaria :Entonces, una variable los llamó
iojlos anulará, potencialmente rompiendo silenciosamente el código que hace cálculos matemáticos complejos.Las posibles soluciones incluyen usar
iiyjjcomo variables de bucle, o usar1isiempre queisea necesario para representar la unidad imaginaria.fuente
iyjvariables.forbucle 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 seaniyj(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 usariyjcomo variables regulares, solo tienen que usarse correctamente como cualquier otra función de Matlab.forbucle 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 usandoiyjpara iterar bucles. Francamente, es una tontería y la gente se está perdiendo el punto más importante de esta pregunta: esoiyjni siquiera debería usarse para la unidad imaginaria si uno quiere escribir código legible de Matlab moderno.Es una buena práctica evitar
iyjvariables para evitar la confusión acerca de que sean variables o la unidad imaginaria.Personalmente, sin embargo, uso
iyjcomo 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 aiyj: 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 deiyjpuede conducir a errores difíciles de depurar como este .iyjes mejor, pero expliqué cómo mi estilo de codificación personal no sigue esa regla.1iy noipara matemáticas complejas. Pensemos en el número imaginario como1iy tomemosicomo número imaginario una mala práctica. No de la otra manera. El uso dei,ii,iiies una práctica común en Matlab y no hay ningún problema cuando las personas se adhieren a1iy1jde 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
iyjcomo 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
iyjcomo variables, y se aceleraría si los cambiara a otra cosa. Es por eso que, si lee mucho código de MathWorks, veráiiyjjusará 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
iyjcomo nombres de variables o no. Si hace mucho trabajo con números complejos, puede evitariy,jcomo variables, evitar cualquier pequeño riesgo potencial de confusión (aunque también puede / solo desea usar1io,1jpara 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
iyjcomo í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
icódigo general no se recomienda por dos razones:Como se sugiere:
1iyiise 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
1icombinado 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,kypEjemplo de los índices más largos:
i_loop,step,walk, yt_nowPor 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
1itendrá un color diferente como número :)doc iydoc 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 usariyjen bucles, etc., o para usar otra cosa que no sea1idenotar la unidad imaginaria (1jtambién funciona). La única excepción es cuando pasa cadenas al motor simbólico siempre ligeramente incompatible. Extraño esohelp 1iydoc 1ino funciona sin embargo.Se señaló que
1ies 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 entre1iyii. Mi sugerencia: usar1jcomo la constante imaginaria donde sea posible. Es el mismo truco que emplean los ingenieros eléctricos - que utilizanjpara lasqrt(-1)causaiya que se da por la corriente .Personalmente nunca uso
iyj; Utilizoiiyjjcomo variables de indexación abreviada (y kk, ll, mm, ...) y1jcuando necesito usar números complejos.fuente
1iyii" Y aún más la diferencia entre1yly entreOy0. 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
forbucles, 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,idxAnotherTaskyidxSubTasketc.O al menos duplicar la primera letra de la matriz que está indexando, por ejemplo,
sspara indexarsubjectList,ttpara indexartaskList, pero noiiojjlo que no me ayuda a identificar sin esfuerzo qué matriz están indexando de mis múltiples para bucles.fuente
Por defecto
iyjrepresenta la unidad imaginaria. Entonces, desde el punto de vista de MATLAB, usaricomo variable es de alguna manera como usar1como variable.fuente
iyjen 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=trueEn mi opinión, la única vez que probablemente debería evitarlos es si su código trata específicamente con números imaginarios.
fuente
ies una función, puede anularse y usarse como una variable. Sin embargo, es mejor evitar usariyjpara 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.