index from example data array arrays matlab syntax operators cell-array

arrays - from - indexing cell matlab



¿Por qué una coma final en una matriz de celdas es válida para la sintaxis de Matlab? (3)

Es conveniente permitir la puntuación final en idiomas si alguna vez se va a generar el código a partir de otro código.

Por ejemplo, Lua permite comas al final, por lo que es fácil generar código Lua.

No es necesario tener un caso especial en el código de generación para omitir la coma final, simplemente puede imprimir ITEM-THEN-COMMA para cada elemento.

Me sorprendió hoy descubrir que

A = {1,2,3}

y

B = {1,2,3,}

Ambos son sintaxis válida en MATLAB. Hubiera esperado que la segunda declaración produjera un error. Lo mejor que puedo decir, producen matrices de células idénticas ( all([A{:}]==[B{:}]) devuelven verdadero).

¿Hay alguna razón por la que se permita la segunda sintaxis? ¿Es esto un error en el analizador? ¿Son A y B realmente iguales?

Curiosamente, lo siguiente no está permitido:

C = {1,2,3,,,}


Estas son más conjeturas, en lugar de una respuesta.

Uno podría verificar la referencia del Símbolo y encontrar que la coma , se puede usar como

Comandante o separador de declaración

Para ingresar más de un comando o declaración de MATLAB en la misma línea, separe cada comando o declaración con una coma:

for k = 1:10, sum(A(k)), end

En la linea

B = {1,2,3,}

por lo tanto, se espera una declaración después de 3 , solo hay } , lo que significa el final de la matriz de celdas , una declaración válida.

El punto ; coma Tiene tres usos oficiales:

Separador de fila de matriz

Cuando se utiliza entre corchetes para crear una nueva matriz o concatenar matrices existentes, el punto y coma crea una nueva fila en la matriz:

A = [5, 8; 3, 4]

Supresión de salida

Cuando se coloca al final de un comando, el punto y coma le dice a MATLAB que no muestre ningún resultado de ese comando. En este ejemplo, MATLAB no muestra la matriz resultante de 100 por 100:

A = ones(100, 100);

Comandante o separador de declaración

Al igual que el operador de coma, puede ingresar más de un comando MATLAB en una línea al separar cada comando con un punto y coma. MATLAB suprime la salida de los comandos terminados con un punto y coma y muestra la salida de los comandos terminados con una coma.

En este ejemplo, las asignaciones a las variables A y C se terminan con un punto y coma y, por lo tanto, no se muestran. Debido a que la asignación a B está terminada por comas, se muestra la salida de este comando:

A = 12.5; B = 42.7, C = 1.25;

Así que en la línea

x = {1,2,3,;5,6,7}

sigue la instrucción válida Array Row Separator después de 3, ,. Luego se espera una nueva declaración, que en este caso es el doble 5 . Válido.

Ahora considera el caso

x = {1,2,3,;;;;4,5,6;;;}

Como se indica más arriba después de 3, sigue la instrucción Array Row Separator , y la declaración después de eso es presumiblemente la declaración nula: NOP tomado de algún núcleo del programa subyacente escrito en C , que básicamente significa: no hacer nada . Así que después de las 3,; Sigue tres veces "no hacer nada" , antes de que llegue la siguiente declaración. No tiene sentido , como Matlab le está diciendo: no es necesario un punto y coma extra. - pero es válido.

También te permite cosas inútiles como:

if true ; end

Y esta es probablemente la razón por la cual

C = {1,2,3,,,}

devuelve un error, porque la coma , no es una instrucción nula , pero después de la primera coma se espera una declaración.

La conclusión es que a mí me parece extraño, pero en realidad me parece lógico, ya que Matlab usa mucho C-Code internamente y, considerando la declaración nula, todo lo mencionado es una sintaxis válida.

¿Qué pasa con otros lenguajes?

Los semiconos utilizados como x = [1,2,3,;;;;4,5,6;;;] en Python no son válidos, incluso en el número de clon de Matlab deseado , a menos que estén incluidos en esta sintaxis poco común a = np.matrix(''1,2,3;4,5,6'') .

a = np.matrix(''1,2,3,;;;;4,5,6;;;'')

lanzaría un error también, como ; En cualquier caso, se interpreta como Separador de fila de arreglos , lo que hace que el compilador se queje de los tamaños de fila inconsitentes.

Sin embargo,

x = [1,2,3,]

También es válida la sintaxis en Python y IronPython , como lo está en VBScript y Lua como se menciona en la respuesta de mlepage . ¿Qué tienen en común todas estas lenguas? Son todos (más o menos) lenguajes de script interpretados durante el tiempo de ejecución. No es sólo Matlab. La emoción del OP por lo tanto permanece sin causa.


Muchos idiomas permiten un separador de elemento adicional en las listas, como ya se mencionó. Pero esto no tiene nada que ver con el análisis en tiempo de ejecución. Incluso C lo permite. Tiene que ver con la facilidad de uso. Esta es una característica destinada a ayudar al usuario. Por ejemplo, en C puede definir una enum siguiente manera:

enum E { a, b, c, };

La coma después de c no es obligatoria, pero está permitida. Facilita la adición y eliminación de elementos de dicha lista, y facilita la generación programática de dicha lista ( ¡la respuesta de mlepage es correcta!).

Por lo tanto, permitir que una coma adicional al final sea común en la mayoría de los lenguajes de programación (si no en todos), tiene sentido que MATLAB también lo admita. La coma adicional al principio de la lista tiene menos sentido, pero supongo que la admiten porque tampoco hace daño.

Las comas múltiples en una fila no tienen sentido, esto implicaría que hay elementos adicionales que no están especificados.

Pero, ¿qué está pasando con los puntos y coma múltiples? Como mencionó Luis Mendo , [1;;2] es una sintaxis legal. Esto es algo que se desvía significativamente de lo que hacen otros idiomas.

Sin embargo, es consistente con el uso de MATLAB del salto de línea. En MATLAB, los saltos de línea son significativos. Cuando se define una matriz utilizando [] , los saltos de línea indican nuevas filas de datos:

M = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ];

es lo mismo que

M = [1,2,3; 4,5,6; 7,8,9];

(Observe cómo permitir las comas al final de cada fila puede ser conveniente a veces).

(También tenga en cuenta que uso [] aquí para concatenar, la misma lógica se aplica a {} ).

Pero debido a que MATLAB quiere permitir tanto como sea posible, siempre que no sea ambiguo, lo anterior es lo mismo que:

M = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ];

Si no hace daño permitir líneas vacías, ¿por qué no permitirlas?

Como cada nueva línea corresponde a un punto y coma, lo anterior es idéntico a:

M = [ 1, 2, 3,;... 4, 5, 6,;... ;... ;... 7, 8, 9,;... ];

que es idéntico a

M = [ 1, 2, 3,; 4, 5, 6,; ; ; 7, 8, 9,; ];

y entonces MATLAB debe ser capaz de analizar eso, tenga sentido o no.

Una refutación de la respuesta de thewaywewalk :

El argumento es que ambos , y ; se definen como separadores de declaración, pero de alguna manera se supone que ;;; es una afirmación válida mientras que ,,, no lo es. Esto simplemente no es cierto:

disp(0),,,disp(1) disp(0);;;disp(1)

ambos son sintaxis MATLAB válida (R2017a analiza ambos sin error).

Además, la respuesta confunde expressions y statements . disp(0) es una declaración. El 0 en esa declaración es una expresión. En M=[1,2,3] , las cosas separadas por comas son expresiones, no declaraciones. Las comas allí no funcionan como separadores de declaración.

De hecho, en MATLAB la coma y el punto y coma tienen varios significados, según el contexto. La coma y el punto y coma al final de una declaración (incluida una declaración nula) son diferentes de la coma y el punto y coma en una expresión de concatenación ( [1,2;3,4] ). Y la coma también puede separar expresiones dentro de los paréntesis de una llamada a función, donde el punto y coma no está permitido.

Solo para aclarar este punto:

1,,,4

es válido, mientras que

[1,,,4]

no es. Las comas tienen diferentes funciones en estas dos declaraciones.

En resumen, la lógica utilizada en esa respuesta es simplemente incorrecta.