xlabel titles tag comando and matlab

titles - Casos de esquina, inesperado e inusual MATLAB



title matlab (3)

Con el paso de los años, al leer el código de los demás, encontré y recopilé algunos ejemplos de la sintaxis de MATLAB, que al principio pueden ser inusuales y contradictorios. Por favor, siéntase libre de comentar o complementar esta lista. Lo verifiqué con r2006a.

MATLAB siempre devuelve el primer argumento de salida de una función (si tiene al menos uno) en su espacio de trabajo llamador, también inesperadamente si se está llamando a la función sin devolver argumentos como myFunc1(); myFunc2(); myFunc1(); myFunc2(); el espacio de trabajo de la persona que llama aún contendría el primer resultado de myFunc2(); como variable ans "invisible". Podría desempeñar un papel importante si ans es un objeto de referencia, permanecería vivo.

set([], ''Background:Color'',''red'')

MATLAB es muy indulgente a veces. En este caso, establecer propiedades en una matriz de objetos también funciona con propiedades sin sentido, al menos cuando la matriz está vacía. Tales matrices generalmente provienen de harray = findobj(0,''Tag'',''NotExistingTag'')

myArray([1,round(end/2)])

Este uso de la palabra clave end puede parecer sucio, pero a veces es muy útil en lugar de usar la length(myArray) .

any([]) ~= all([])

Sorpresivamente any([]) devuelve false y all([]) devuelve true . Y siempre pensé que all es más fuerte que any .

EDITAR:

con argumento no vacío all() devuelve true para un subconjunto de valores para el cual any() devuelve true (por ejemplo, tabla de verdad). Esto significa que any() false implica que all() false . Esta regla simple está siendo violada por MATLAB con [] como argumento.

Loren también escribió un blog acerca de eso .

Select(Range(ExcelComObj))

Estilo de procedimiento Envío de métodos de objetos COM. ¡No se pregunte si exist(''Select'') devuelve cero!

[myString, myCell]

MATLAB hace en este caso un molde implícito de la variable de cadena myString al tipo de celda {myString} . Funciona, también si no esperaría que lo haga.

[double(1.8), uint8(123)] => 2 123

Otro ejemplo de reparto Todo el mundo probablemente esperaría que el valor de uint8 se double pero Mathworks tiene otra opinión. Sin una advertencia, este comportamiento es muy peligroso.

a = 5; b = a();

Parece tonto, pero puede llamar a una variable con corchetes redondos. En realidad tiene sentido porque de esta forma puedes ejecutar una función dado su manejo.

La sintaxis Foo(:) funciona no solo en datos sino también con funciones si se llama como Bar.Foo(:) , en este escenario, el argumento de entrada de función se pasa como char colon '':'' .

Por ejemplo, deje Bar.Foo = @(x) disp(x) Ahora llamando a Bar.Foo(:) imprime char '':'' en la ventana de comandos de MATLAB.

Esta característica extraña funciona con todas las versiones de MATLAB 7 sin advertencias.

a = {''aa'', ''bb'' ''cc'', ''dd''};

Sorprendentemente, este código no devuelve un vector ni genera un error, sino que define la matriz, utilizando solo el diseño del código. Es probablemente una reliquia de la antigüedad.

EDITAR: característica muy útil, vea el comentario de gnovice.

set(hobj, {''BackgroundColor'',''ForegroundColor''},{''red'',''blue''})

Este código hace lo que probablemente esperas que haga. Ese set funciones acepta una estructura ya que su segundo argumento es un hecho conocido y tiene sentido, y este sintax está a solo una cell2struct distancia.

Las reglas de equivalencia a veces son inesperadas al principio. Por ejemplo, ''A''==65 devuelve verdadero (aunque para los expertos en C es evidente). Del isequal([],{}) modo isequal([],{}) vuelve a funcionar, como se esperaba, es false e isequal([],'''') devuelve true .

La equivalencia cadena-numérica significa que todas las funciones de cadena se pueden usar también para matrices numéricas, por ejemplo para encontrar índices de una matriz secundaria en una matriz grande:

ind = strfind( [1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3] )

Función MATLAB isnumeric() devuelve false para booleanos. Esto se siente ... falso :-)

¿Sobre qué características inesperadas / inusuales de MATLAB conoce?


En lugar de enumerar ejemplos de la sintaxis rara de MATLAB, abordaré algunos de los ejemplos de la pregunta que creo que tienen sentido o que se espera / documenta / desea.

  • Cómo ANY y ALL manejan los argumentos vacíos:

    El resultado de any([]) tiene sentido: no hay elementos distintos de cero en el vector de entrada (ya que está vacío), por lo que devuelve falso.

    El resultado de all([]) se puede comprender mejor al pensar en cómo puede implementar su propia versión de esta función:

    function allAreTrue = my_all(inArray) allAreTrue = true; N = numel(inArray); index = 1; while allAreTrue && (index <= N) allAreTrue = (inArray(index) ~= 0); index = index + 1; end end

    Esta función recorre los elementos de inArray hasta que encuentra uno que es cero. Si inArray está vacío, el bucle nunca se ingresa y se devuelve el valor predeterminado de allAreTrue .

  • Concatenación a diferencia de las clases:

    Al concatenar diferentes tipos en una matriz, MATLAB sigue una precedencia preestablecida de clases y convierte los valores en consecuencia. El orden de precedencia general (de mayor a menor) es: char , integer (de cualquier signo o número de bits), single , double y logical . Esta es la razón por la cual [double(1.8), uint8(123)] le da un resultado de type uint8 . Al combinar a diferencia de los tipos enteros ( uint8 , int32 , etc.), el elemento de la matriz más a la izquierda determina el tipo del resultado .

  • Varias líneas sin usar el operador de continuación de línea ( ... ) :

    Al construir una matriz con varias filas, simplemente puede presionar regresar después de ingresar una fila e ingresar la siguiente fila en la línea siguiente, sin tener que usar un semicolon y semicolon para definir una nueva fila o ... para continuar la línea. Las siguientes declaraciones son por lo tanto equivalentes:

    a = {''aa'', ''bb'' ''cc'', ''dd''}; a = {''aa'', ''bb''; ... ''cc'', ''dd''}; a = {''aa'', ''bb''; ''cc'', ''dd''};

    ¿Por qué querrías que MATLAB se comportara así? Una razón por la que me he dado cuenta es que hace que sea fácil cortar y pegar datos de, por ejemplo, un documento de Excel en una variable en la ventana de comandos de MATLAB. Pruebe lo siguiente:

    • Seleccione una región en un archivo de Excel y cópielo.
    • Escriba a = [ en MATLAB sin presionar return .
    • Haga clic derecho en la ventana de comandos de MATLAB y seleccione "Pegar".
    • Tipo ]; y presiona return. Ahora tiene una variable a que contiene los datos de las filas y columnas que seleccionó en el archivo de Excel y que mantiene la "forma" de los datos.

Arrays vs. cells

Veamos una sintaxis básica para comenzar. Para crear una matriz con los elementos a , b , c escribe [abc] . Para crear una celda con matrices A , B , C escribe {ABC} . Hasta aquí todo bien.

El acceso a los elementos de la matriz se hace así: arr(i) . Para las células, es la cell{i} . Sigue bien.

Ahora intentemos eliminar un elemento. Para matrices: arr(i) = [] . Extrapolando de los ejemplos anteriores, puede probar cell{i} = {} para las celdas, pero este es un error de sintaxis . La sintaxis correcta para eliminar un elemento de una celda es, de hecho, la misma sintaxis que utiliza para las matrices: cell(i) = [] .

Por lo tanto, la mayoría de las veces accedes a las celdas usando sintaxis especial, pero cuando borras elementos usas la sintaxis de la matriz.

Si cavas más profundo, encontrarás que en realidad una celda es una matriz donde cada valor es de cierto tipo. Así que aún puedes escribir la cell(i) , obtendrás {A} (¡una celda de un solo valor!). cell{i} es una abreviatura para recuperar A directamente.

Todo esto no es muy bonito IMO.


Coordenadas de la imagen frente a las coordenadas de la trama Se utiliza para obtenerme todo el tiempo.

%# create an image with one white pixel img = zeros(100); img(25,65) = 1; %# show the image figure imshow(img); %# now circle the pixel. To be sure of the coordinate, let''s run find [x,y] = find(img); hold on %# plot a red circle... plot(x,y,''or'') %# ... and it''s not in the right place %# plot a green circle with x,y switched, and it works plot(y,x,''og'')

Editar 1

Dimensiones de la matriz

Las variables tienen al menos dos dimensiones. Los escalares son de tamaño [1,1] , los vectores son de tamaño [1,n] o [n,1] . Por lo tanto, ndims devuelve 2 para cualquiera de ellos (de hecho, ndims([]) es 2 también, ya que size([]) es [0,0] ). Esto hace que sea un poco complicado probar la dimensionalidad de su entrada. Para verificar las matrices 1D, debe usar isvector , las matrices 0D necesitan isscalar .

Editar 2

Asignaciones de matriz

Normalmente, Matlab es estricto con asignaciones de matriz. Por ejemplo

m = magic(3); m(1:2,1:3) = zeros(3,2);

arroja un

??? Subscripted assignment dimension mismatch.

Sin embargo, estos trabajos:

m(1:2,1:2) = 1; %# scalar to vector m(2,:) = ones(3,1); %# vector n-by-1 to vector 1-by-n (for newer Matlab versions) m(:) = 1:9; %# vector to ''linearized array''

Editar 3

Indización lógica con arreglos de tamaño incorrecto ¡ Buena suerte depurando esto!

La indexación lógica parece hacer una llamada para find , ya que su matriz lógica no necesita la misma cantidad de elementos que índices.

>> m = magic(4); %# a 4-by-4 array >> id = logical([1 1 0 1 0]) id = 1 1 0 1 0 >> m(id,:) %# id has five elements, m only four rows ans = 16 2 3 13 5 11 10 8 4 14 15 1 %# this wouldn''t work if the last element of id was 1, btw >> id = logical([1 1 0]) id = 1 1 0 >> m(id,:) %# id has three elements, m has four rows ans = 16 2 3 13 5 11 10 8