Usando i y j como variables en Matlab

142

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?

Shai
fuente
55
Por supuesto, no lo marcaré como tal, pero a juzgar por las respuestas, diría que esto está "principalmente basado en la opinión". ;-) Yo personalmente no renunciar a i, j, kcomo los nombres de las variables de bucle genéricos.
A. Donda
1
@ A.Donda bueno, esta es tu opinión;)
Shai
@Shai, esta es tu última oración en esta pregunta: "¿Por qué no deberían usarse como nombres de variables en Matlab?" Entonces, ¿no está muy claro por qué rechazas mi edición en tu pregunta? Cambié su título a un título más constructivo "¿Por qué NO debería usar iyj como variables en Matlab"
Seyfi

Respuestas:

176

Porque iy jambas son funciones que denotan la unidad imaginaria :

Entonces, una variable los llamó io jlos anulará, potencialmente rompiendo silenciosamente el código que hace cálculos matemáticos complejos.

Las posibles soluciones incluyen usar iiy jjcomo variables de bucle, o usar 1isiempre que isea ​​necesario para representar la unidad imaginaria.

Oliver Charlesworth
fuente
42
También vale la pena señalar que incluso si no está rompiendo nada, el tiempo de ejecución aún se sacrifica para resolver los nombres iy jvariables.
Eitan T
14
@Eitan: ¿Puedes respaldar eso de una manera concreta y concluyente en una versión compilada JIT de Matlab? Nunca he encontrado que sea el caso (y las pruebas simples que llaman a un 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 sean iy j(y k?) 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 usar iy jcomo variables regulares, solo tienen que usarse correctamente como cualquier otra función de Matlab.
horchler
55
@horchler Bueno, los documentos oficiales afirman aquí que anular las clases de datos estándar de MATLAB "puede afectar negativamente el rendimiento", y aquí está implícito evitar anular constantes complejas por razones de velocidad, así como de robustez. En documentos anteriores de R2009b , se recomienda explícitamente contra anular constantes complejas, ya que esto puede dificultar la aceleración JIT. La resolución de nombre variable es quizás minúscula, pero puede ser significativa si se repite millones de veces.
Eitan T
14
En versiones antiguas de Matlab tal vez. Yo solía ver eso yo mismo. Pero ya no con R2012a + (OS X) al menos. Y no vi ninguna diferencia al llamar a un 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 usando iy jpara iterar bucles. Francamente, es una tontería y la gente se está perdiendo el punto más importante de esta pregunta: eso iy jni siquiera debería usarse para la unidad imaginaria si uno quiere escribir código legible de Matlab moderno.
horchler
12
Mi mayor ahorro de tiempo es cuando hago una búsqueda de ii. Buscando puedo ser un verdadero dolor
craq
62

Es una buena práctica evitar iy jvariables para evitar la confusión acerca de que sean variables o la unidad imaginaria.

Personalmente, sin embargo, uso iy jcomo 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 a iy j: no use para denotar números imaginarios. De hecho, la propia documentación de Matlab establece :

Para velocidad y robustez mejorada, puede reemplazar complejos i y jpor 1i.

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 representa sqrt(-1)porque posiblemente no podría ser una variable.

shoelzer
fuente
2
De hecho, es una buena práctica usar 1i. Sin embargo, cambiar el significado de iy jpuede conducir a errores difíciles de depurar como este .
Shai
1
@Shai Buen punto. Modifiqué mi respuesta para reconocer que evitar iy jes mejor, pero expliqué cómo mi estilo de codificación personal no sigue esa regla.
shoelzer
2
Tenga en cuenta que la velocidad mencionada no parece ser muy significativa: stackoverflow.com/questions/18163454/…
Dennis Jaheruddin
¡Totalmente de acuerdo! La buena práctica es SIEMPRE usar 1iy no ipara matemáticas complejas. Pensemos en el número imaginario como 1iy tomemos icomo número imaginario una mala práctica. No de la otra manera. El uso de i, ii, iiies una práctica común en Matlab y no hay ningún problema cuando las personas se adhieren a 1iy 1jde 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.
SdidS
iyj no deberían usarse de todos modos, esos números significan algo , use un nombre que describa el propósito (row_n, elementNo, listItemIndex, etc.). Es mucho más fácil para alguien entender lo que está haciendo, depurar, etc. El tiempo extra que gasta es más que valioso para ganar en el mantenimiento a largo plazo para algo más que un script desechable, incluso con el Editor de Matlab atrasado. La mayoría de los otros IDEs modernos.
LightCC
27

En versiones anteriores de MATLAB, solía haber una buena razón para evitar el uso de iy jcomo 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 iy jcomo variables, y se aceleraría si los cambiara a otra cosa. Es por eso que, si lee mucho código de MathWorks, verá iiy jjusará 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 iy jcomo nombres de variables o no. Si hace mucho trabajo con números complejos, puede evitar iy, jcomo variables, evitar cualquier pequeño riesgo potencial de confusión (aunque también puede / solo desea usar 1io, 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 iy jcomo í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:

Como i es una función, puede anularse y usarse como una variable. Sin embargo, es mejor evitar usar i y j para nombres de variables si tiene la intención de usarlos en aritmética compleja. [...] Para mayor velocidad y robustez mejorada, puede reemplazar complejos i y j por 1i.

Sam Roberts
fuente
15

Como se describe en otras respuestas, el uso del icódigo general no se recomienda por dos razones:

  • Si desea usar el número imaginario, puede confundirse o sobrescribirse con un índice
  • Si lo usa como índice, puede sobrescribir o confundirse con el número imaginario

Como se sugiere: 1iy iise recomiendan. Sin embargo, aunque ambas son desviaciones finas i, no es muy bueno usar ambas alternativas juntas.

Aquí hay un ejemplo de por qué (personalmente) no me gusta:

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

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, kyp

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.

Dennis Jaheruddin
fuente
1
1i denota la unidad imaginaria (también los nombres de variables de Matlab no pueden comenzar con un número)
lib
2
@DennisJaheruddin: enchufe descarado: use mi sintaxis de MATLAB para resaltar el script de usuario para Stack Overflow. En el último ejemplo, 1itendrá un color diferente como número :)
Amro
2
Directamente desde doc iy doc 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 usar iy jen bucles, etc., o para usar otra cosa que no sea 1idenotar la unidad imaginaria ( 1jtambién funciona). La única excepción es cuando pasa cadenas al motor simbólico siempre ligeramente incompatible. Extraño eso help 1iy doc 1ino funciona sin embargo.
horchler
11

Se señaló que 1ies una forma aceptable y no ambigua de escribir sqrt(-1), y que como tal no hay necesidad de evitar el uso i. Por otra parte, como señaló Dennis ( https://stackoverflow.com/a/14893729/1967396 ), puede ser difícil ver la diferencia entre 1iy ii. Mi sugerencia: usar 1jcomo la constante imaginaria donde sea posible. Es el mismo truco que emplean los ingenieros eléctricos - que utilizan jpara la sqrt(-1)causa iya que se da por la corriente .

Personalmente nunca uso iy j; Utilizo iiy jjcomo variables de indexación abreviada (y kk, ll, mm, ...) y 1jcuando necesito usar números complejos.

Floris
fuente
2
"Puede ser difícil ver la diferencia entre 1iy ii" Y aún más la diferencia entre 1y ly entre Oy 0. Es por eso que el primer paso que hago en una nueva instalación de MATALB es cambiar el tamaño de fuente predeterminado.
glglgl
6

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.

  1. 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.

  2. 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.

xenoclasto
fuente
4

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 como idxTask, idxAnotherTasky idxSubTasketc.

O al menos duplicar la primera letra de la matriz que está indexando, por ejemplo, sspara indexar subjectList, ttpara indexar taskList, pero no iio jjlo que no me ayuda a identificar sin esfuerzo qué matriz están indexando de mis múltiples para bucles.

Pradeep Reddy Raamana
fuente
3

Por defecto iy jrepresenta la unidad imaginaria. Entonces, desde el punto de vista de MATLAB, usar icomo variable es de alguna manera como usar 1como variable.

yo'
fuente
55
No creo que sea así. i es un nombre de variable legítimo, por lo que puedes usar i y j como nombres de variable. Como una respuesta anterior menciona, enmascarará el significado imaginario. 1 no es un nombre de variable legítimo. está totalmente bien si nunca usas números complejos.
thang
@thang por eso dije "de alguna manera me gusta" y no "me gusta". Sé que hay una diferencia. OP preguntó por qué no deberían usarse, traté de explicar que es porque ya expresan un número.
yo '
2
ok, lo siento, no sé lo que de alguna manera me gusta . para mí es claramente diferente porque, bueno, no puedes usar 1 como variable incluso si quisieras ... pero veo de dónde vienes.
thang
usted puede usarlos, ya que también puede utilizar los nombres de funciones existentes para las variables (y al mismo tiempo, la corrupción de las funciones incorporadas / constantes para su uso posterior). Si realmente quieres eso es otra cosa (respuesta simple de la OMI: no)
Gunther Struyf
1
Lo siento, pero esta explicación no tiene sentido. El iy jen 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.
patrik
2

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, definirfalse=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.

gregswiss
fuente
¿Pueden comentar al votar hacia abajo? Por ejemplo, con un enlace de Mathworks que indica que la práctica no se recomienda (lo cual ha sido indicado por varios pósters sin hacer referencia a ninguna directriz oficial). De hecho, el uso de 'i' en bucles se está utilizando en ejemplos oficiales por parte de Mathworks. En mi experiencia, hace que el código sea claro y conciso, y es una práctica muy común.
gregswiss
1
Citando la documentación "Dado que ies una función, puede anularse y usarse como una variable. Sin embargo, es mejor evitar usar iy jpara 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.
Adriaan
1
También tenga en cuenta que ya hay una respuesta de 2013 con el comentario mencionado por @Adriaan.
Andras Deak
1
por lo que la documentación indica SI tiene la intención de usar en aritmética compleja, de lo contrario no se aplica, ¡no sé por qué todo el mundo es tan quisquilloso aquí! Solo estaba ofreciendo un punto de vista alternativo.
gregswiss