MATLAB LanguageEmpezando con MATLAB Language


Versiones

Versión Lanzamiento Fecha de lanzamiento
1.0 1984-01-01
2 1986-01-01
3 1987-01-01
3.5 1990-01-01
4 1992-01-01
4.2c 1994-01-01
5.0 Volumen 8 1996-12-01
5.1 Volumen 9 1997-05-01
5.1.1 R9.1 1997-05-02
5.2 R10 1998-03-01
5.2.1 R10.1 1998-03-02
5.3 R11 1999-01-01
5.3.1 R11.1 1999-11-01
6.0 R12 2000-11-01
6.1 R12.1 2001-06-01
6.5 R13 2002-06-01
6.5.1 R13SP2 2003-01-01
6.5.2 R13SP2 2003-01-02
7 R14 2006-06-01
7.0.4 R14SP1 2004-10-01
7.1 R14SP3 2005-08-01
7.2 R2006a 2006-03-01
7.3 R2006b 2006-09-01
7.4 R2007a 2007-03-01
7.5 R2007b 2007-09-01
7.6 R2008a 2008-03-01
7.7 R2008b 2008-09-01
7.8 R2009a 2009-03-01
7.9 R2009b 2009-09-01
7.10 R2010a 2010-03-01
7.11 R2010b 2010-09-01
7.12 R2011a 2011-03-01
7.13 R2011b 2011-09-01
7.14 R2012a 2012-03-01
8.0 R2012b 2012-09-01
8.1 R2013a 2013-03-01
8.2 R2013b 2013-09-01
8.3 R2014a 2014-03-01
8.4 R2014b 2014-09-01
8.5 R2015a 2015-03-01
8.6 R2015b 2015-09-01
9.0 R2016a 2016-03-01
9.1 R2016b 2016-09-14
9.2 R2017a 2017-03-08

Vea también: Historial de lanzamientos de MATLAB en Wikipedia .

Funciones anónimas y manejadores de funciones.

Lo esencial

Las funciones anónimas son una herramienta poderosa del lenguaje MATLAB. Son funciones que existen localmente, es decir: en el espacio de trabajo actual. Sin embargo, no existen en la ruta MATLAB como lo haría una función normal, por ejemplo, en un archivo-m. Por eso se los llama anónimos, aunque pueden tener un nombre como una variable en el área de trabajo.

El operador @

Use el operador @ para crear funciones anónimas y manejadores de funciones. Por ejemplo, para crear un controlador para la función sin (sine) y usarlo como f :

>> f = @sin
f = 
    @sin
 

Ahora f es una manija de la función de sin . Al igual que (en la vida real) una manija de puerta es una forma de usar una puerta, una manija de función es una forma de usar una puerta. Para usar f , los argumentos se le pasan como si fuera la función sin :

>> f(pi/2)
ans =
     1
 

f acepta cualquier argumento de entrada que acepte la función sin . Si sin sería una función que acepta cero argumentos de entrada (que no lo hace, pero otros sí lo hacen, por ejemplo, la función de peaks ), f() se usaría para llamarla sin argumentos de entrada.

Funciones anónimas personalizadas

Funciones anónimas de una variable.

Obviamente, no es útil crear un identificador para una función existente, como el sin en el ejemplo anterior. Es un poco redundante en ese ejemplo. Sin embargo, es útil crear funciones anónimas que hagan cosas personalizadas que de lo contrario tendrían que repetirse varias veces o crear una función separada para. Como ejemplo de una función anónima personalizada que acepta una variable como entrada, sume el seno y el coseno al cuadrado de una señal:

>> f = @(x) sin(x)+cos(x).^2
f = 
    @(x)sin(x)+cos(x).^2
 

Ahora f acepta un argumento de entrada llamado x . Esto se especificó utilizando paréntesis (...) directamente después del operador @ . f ahora es una función anónima de x : f(x) . Se usa pasando un valor de x a f :

>> f(pi)
ans =
    1.0000
 

Un vector de valores o una variable también se puede pasar a f , siempre que se utilicen de manera válida dentro de f :

>> f(1:3) % pass a vector to f
ans =
    1.1334    1.0825    1.1212
>> n = 5:7;
>> f(n) % pass n to f
ans =
   -0.8785    0.6425    1.2254
 

Funciones anónimas de más de una variable.

De la misma manera, se pueden crear funciones anónimas para aceptar más de una variable. Un ejemplo de una función anónima que acepta tres variables:

>> f = @(x,y,z) x.^2 + y.^2 - z.^2
f = 
    @(x,y,z)x.^2+y.^2-z.^2
>> f(2,3,4)
ans =
    -3
 

Parametrización de funciones anónimas

Las variables en el área de trabajo se pueden usar dentro de la definición de funciones anónimas. Esto se llama parametrización. Por ejemplo, para usar una constante c = 2 en una función anónima:

>> c = 2;
>> f = @(x) c*x
f = 
    @(x)c*x
>> f(3)
ans =
     6
 

f(3) usó la variable c como parámetro para multiplicar con la x proporcionada. Tenga en cuenta que si el valor de c se establece en algo diferente en este punto, entonces se llama a f(3) , el resultado no sería diferente. El valor de c es el valor en el momento de la creación de la función anónima:

>> c = 2;
>> f = @(x) c*x;
>> f(3)
ans =
     6
>> c = 3;
>> f(3)
ans =
     6
 

Los argumentos de entrada a una función anónima no se refieren a las variables del área de trabajo

Tenga en cuenta que usar el nombre de las variables en el área de trabajo como uno de los argumentos de entrada de una función anónima (es decir, usar @(...) ) no usará los valores de esas variables. En su lugar, se tratan como variables diferentes dentro del alcance de la función anónima, es decir: la función anónima tiene su espacio de trabajo privado donde las variables de entrada nunca se refieren a las variables del espacio de trabajo principal. El espacio de trabajo principal y el espacio de trabajo de la función anónima no conocen los contenidos de los demás. Un ejemplo para ilustrar esto:

>> x = 3 % x in main workspace
x =
     3
>> f = @(x) x+1; % here x refers to a private x variable
>> f(5)
ans =
     6
>> x
x =
     3
 

El valor de x del espacio de trabajo principal no se usa dentro de f . Además, en el espacio de trabajo principal x quedó sin tocar. Dentro del alcance de f , los nombres de las variables entre paréntesis después del operador @ son independientes de las variables principales del área de trabajo.

Las funciones anónimas se almacenan en variables.

Una función anónima (o, más precisamente, el controlador de función que apunta a una función anónima) se almacena como cualquier otro valor en el espacio de trabajo actual: en una variable (como hicimos anteriormente), en una matriz de celdas ( {@(x)x.^2,@(x)x+1} ), o incluso en una propiedad (como h.ButtonDownFcn para gráficos interactivos). Esto significa que la función anónima puede tratarse como cualquier otro valor. Al almacenarlo en una variable, tiene un nombre en el espacio de trabajo actual y se puede cambiar y borrar al igual que las variables que contienen números.

En otras palabras: un manejador de función (ya sea en la forma @sin o para una función anónima) es simplemente un valor que puede almacenarse en una variable, como lo puede ser una matriz numérica.

Uso avanzado

Pasando los mangos de funciones a otras funciones.

Como los manejadores de función se tratan como variables, se pueden pasar a funciones que aceptan los manejadores de función como argumentos de entrada.

Un ejemplo: una función se crea en un archivo-m que acepta un identificador de función y un número escalar. A continuación, llama al controlador de función pasándole 3 y luego agrega el número escalar al resultado. Se devuelve el resultado.

Contenido de funHandleDemo.m :

function y = funHandleDemo(fun,x)
y = fun(3);
y = y + x;
 

Guárdelo en algún lugar de la ruta, por ejemplo, en la carpeta actual de MATLAB. Ahora funHandleDemo se puede usar de la siguiente manera, por ejemplo:

>> f = @(x) x^2; % an anonymous function
>> y = funHandleDemo(f,10) % pass f and a scalar to funHandleDemo
y =
    19
 

El identificador de otra función existente se puede pasar a funHandleDemo :

>> y = funHandleDemo(@sin,-5)
y =
   -4.8589
 

Observe cómo @sin era una forma rápida de acceder al sin función sin primero almacenarlo en una variable mediante f = @sin .

Usando bsxfun , cellfun y funciones similares con funciones anónimas

MATLAB tiene algunas funciones integradas que aceptan funciones anónimas como entrada. Esta es una forma de realizar muchos cálculos con un número mínimo de líneas de código. Por ejemplo, bsxfun , que realiza operaciones binarias elemento por elemento, es decir: aplica una función en dos vectores o matrices en una forma elemento por elemento. Normalmente, esto requeriría el uso de for loops, que a menudo requiere una preasignación para la velocidad. Usando bsxfun este proceso se acelera. El siguiente ejemplo ilustra esto usando tic y toc , dos funciones que se pueden usar para medir el tiempo que toma el código. Calcula la diferencia de cada elemento de la matriz a partir de la media de la columna de la matriz.

A = rand(50); % 50-by-50 matrix of random values between 0 and 1

% method 1: slow and lots of lines of code
tic
meanA = mean(A); % mean of every matrix column: a row vector
% pre-allocate result for speed, remove this for even worse performance
result = zeros(size(A));
for j = 1:size(A,1)
    result(j,:) = A(j,:) - meanA;
end
toc
clear result % make sure method 2 creates its own result

% method 2: fast and only one line of code
tic
result = bsxfun(@minus,A,mean(A));
toc
 

Al ejecutar el ejemplo anterior se obtienen dos resultados:

Elapsed time is 0.015153 seconds.
Elapsed time is 0.007884 seconds.
 

Estas líneas provienen de las funciones toc , que imprimen el tiempo transcurrido desde la última llamada a la función tic .

La llamada bsxfun aplica la función en el primer argumento de entrada a los otros dos argumentos de entrada. @minus es un nombre largo para la misma operación que haría el signo menos. Una función anónima diferente o manejar ( @ ) para cualquier otra función que podría haber sido especificado, siempre y cuando se acepta A y mean(A) como insumos para generar un resultado significativo.

Especialmente para grandes cantidades de datos en matrices grandes, bsxfun puede acelerar mucho las cosas. También hace que el código se vea más limpio, aunque podría ser más difícil de interpretar para las personas que no conocen MATLAB o bsxfun . (Tenga en cuenta que en MATLAB R2016a y posteriores, muchas de las operaciones que utilizaron previamente bsxfun ya no las necesitan; A-mean(A) funciona directamente y en algunos casos puede ser incluso más rápida).

Arrays celulares

Los elementos de la misma clase a menudo se pueden concatenar en arreglos (con algunas raras excepciones, por ejemplo, manejadores de funciones). Los escalares numéricos, por defecto de clase double , pueden almacenarse en una matriz.

>> A = [1, -2, 3.14, 4/5, 5^6; pi, inf, 7/0, nan, log(0)]
A =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf
 

Los caracteres, que son de clase char en MATLAB, también pueden almacenarse en una matriz usando una sintaxis similar. Dicha matriz es similar a una cadena en muchos otros lenguajes de programación.

>> s = ['MATLAB ','is ','fun']
s =
MATLAB is fun
 

Tenga en cuenta que a pesar de que ambos utilizan corchetes [ y ] , las clases de resultados son diferentes. Por lo tanto, las operaciones que se pueden hacer en ellos también son diferentes.

>> whos
  Name      Size            Bytes  Class     Attributes

  A         2x5                80  double              
  s         1x13               26  char                
 

De hecho, la matriz s no es una matriz de las cadenas 'MATLAB ' , 'is ' y 'fun' , es solo una cadena, una matriz de 13 caracteres. Obtendría los mismos resultados si estuviese definido por alguno de los siguientes:

>> s = ['MAT','LAB ','is f','u','n'];
>> s = ['M','A','T','L','A','B,' ','i','s',' ','f','u','n'];
 

Un vector MATLAB regular no le permite almacenar una mezcla de variables de diferentes clases o unas pocas cadenas diferentes. Aquí es donde la matriz de cell es útil. Esta es una matriz de celdas que cada una puede contener algún objeto MATLAB, cuya clase puede ser diferente en cada celda si es necesario. Use llaves { y } alrededor de los elementos para almacenar en una matriz de celdas.

>> C = {A; s}
C = 
    [2x5 double]
    'MATLAB is fun'
>> whos C
  Name      Size            Bytes  Class    Attributes

  C         2x1               330  cell 
 

Los objetos MATLAB estándar de cualquier clase se pueden almacenar juntos en una matriz de celdas. Tenga en cuenta que las matrices de celdas requieren más memoria para almacenar sus contenidos.

El acceso al contenido de una celda se realiza utilizando llaves { y } .

>> C{1}
ans =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf
 

Tenga en cuenta que C(1) es diferente de C{1} . Mientras que el último devuelve el contenido de la celda (y tiene una clase double en el ejemplo), el primero devuelve una matriz de celdas que es una sub-matriz de C De manera similar, si D fuera una matriz de 10 por 5 celdas, entonces D(4:8,1:3) devolvería una sub-matriz de D cuyo tamaño es 5 por 3 y cuya clase es cell . Y la sintaxis C{1:2} no tiene un solo objeto devuelto, sino que devuelve 2 objetos diferentes (similar a una función MATLAB con múltiples valores de retorno):

>> [x,y] = C{1:2}
x =
                         1                        -2                      3.14                       0.8                     15625
          3.14159265358979                       Inf                       Inf                       NaN                      -Inf
y =
MATLAB is fun
 

Tipos de datos

Hay 16 tipos de datos fundamentales , o clases, en MATLAB. Cada una de estas clases tiene la forma de una matriz o matriz. Con la excepción de los manejadores de funciones, esta matriz o matriz tiene un tamaño mínimo de 0 por 0 y puede crecer a una matriz n-dimensional de cualquier tamaño. Un controlador de función siempre es escalar (1 por 1).

El momento importante en MATLAB es que no es necesario utilizar ninguna declaración de tipo o declaración de dimensión de forma predeterminada. Cuando define una nueva variable, MATLAB la crea automáticamente y asigna el espacio de memoria apropiado.

Ejemplo:

a = 123;
b = [1 2 3];
c = '123';

>> whos
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  b         1x3                24  double              
  c         1x3                 6  char    
 

Si la variable ya existe, MATLAB reemplaza los datos originales por uno nuevo y asigna nuevo espacio de almacenamiento si es necesario.

Tipos de datos fundamentales

Los tipos de datos fundamentales son: numérico, logical , char , cell , struct , table y function_handle .

Tipos de datos numéricos :

  • Números de punto flotante (por defecto )

    MATLAB representa números de punto flotante en formato de precisión doble o de precisión simple. El valor predeterminado es la precisión doble, pero puede hacer que cualquier número tenga una sola precisión con una función de conversión simple:

    a = 1.23;
    b = single(a);
    
    >> whos
      Name      Size            Bytes  Class     Attributes
    
      a         1x1                 8  double              
      b         1x1                 4  single     
     
  • Enteros

    MATLAB tiene cuatro clases enteras con signo y cuatro sin signo. Los tipos con signo le permiten trabajar con enteros negativos y positivos, pero no pueden representar un rango de números tan amplio como los tipos sin signo porque se utiliza un bit para designar un signo positivo o negativo para el número. Los tipos sin firmar le ofrecen una gama más amplia de números, pero estos números solo pueden ser cero o positivos.

    MATLAB admite el almacenamiento de 1, 2, 4 y 8 bytes para datos enteros. Puede ahorrar memoria y tiempo de ejecución para sus programas si utiliza el tipo de entero más pequeño que acomoda sus datos. Por ejemplo, no necesita un entero de 32 bits para almacenar el valor 100.

    a = int32(100);
    b = int8(100);
    
    >> whos
      Name      Size            Bytes  Class    Attributes
    
      a         1x1                 4  int32              
      b         1x1                 1  int8               
     

    Para almacenar datos como un entero, debe convertir el doble al tipo de entero deseado. Si el número que se está convirtiendo en un entero tiene una parte fraccionaria, MATLAB redondea al entero más cercano. Si la parte fraccionaria es exactamente 0.5 , entonces, de los dos enteros igualmente cercanos, MATLAB elige aquel para el cual el valor absoluto es mayor en magnitud.

    a  = int16(456);
     
  • char

    Las matrices de caracteres proporcionan almacenamiento para datos de texto en MATLAB. De acuerdo con la terminología de programación tradicional, una matriz (secuencia) de caracteres se define como una cadena. No hay un tipo de cadena explícito en las versiones comerciales de MATLAB.

  • lógico: los valores lógicos de 1 o 0, representan verdadero y falso respectivamente. Se usa para condiciones relacionales e indexación de matrices. Porque es VERDADERO o FALSO tiene un tamaño de 1 byte.

    a = logical(1);
     
  • estructura. Una matriz de estructura es un tipo de datos que agrupa variables de diferentes tipos de datos utilizando contenedores de datos llamados campos . Cada campo puede contener cualquier tipo de datos. Acceda a los datos en una estructura usando la notación de puntos del formulario structName.fieldName.

    field1 = 'first';
    field2 = 'second';
    value1 = [1 2 3 4 5];
    value2 = 'sometext';
    s = struct(field1,value1,field2,value2);
     

    Para acceder a value1, cada una de las siguientes sintaxis son equivalentes

    s.first or s.(field1) or s.('first')
     

    Podemos acceder explícitamente a un campo que sabemos que existirá con el primer método, o bien pasar una cadena o crear una cadena para acceder al campo en el segundo ejemplo. El tercer ejemplo está demostrando que la notación de puntos entre parásitos toma una cadena, que es la misma almacenada en la variable field1.

  • las variables de la tabla pueden ser de diferentes tamaños y tipos de datos, pero todas las variables deben tener el mismo número de filas.

    Age = [15 25 54]';
    Height = [176 190 165]';
    Name = {'Mike', 'Pete', 'Steeve'}';
    T = table(Name,Age, Height);
     
  • célula. Es muy útil el tipo de datos MATLAB: la matriz de celdas es una matriz en la que cada elemento puede ser de diferente tipo y tamaño de datos. Es un instrumento muy fuerte para manipular los datos como desee.

    a = { [1 2 3], 56, 'art'};
     

    o

    a = cell(3);
     
  • manijas de función almacena un puntero a una función (por ejemplo, a función anónima). Le permite pasar una función a otra función o llamar a funciones locales desde fuera de la función principal.

Hay muchos instrumentos para trabajar con cada tipo de datos y también funciones str2double conversión de tipos de datos ( str2double , table2cell ).

Tipos de datos adicionales

Hay varios tipos de datos adicionales que son útiles en algunos casos específicos. Son:

  • Fecha y hora: matrices para representar fechas, hora y duración. datetime('now') devuelve 21-Jul-2016 16:30:16 .

  • Arreglos categóricos: es el tipo de datos para almacenar datos con valores de un conjunto de categorías discretas. Útil para almacenar datos no numéricos (memoria efectiva). Se puede utilizar en una tabla para seleccionar grupos de filas.

    a = categorical({'a' 'b' 'c'});
     
  • Los contenedores de mapas son una estructura de datos que tiene una capacidad única para indexar no solo a través de los valores numéricos escalares sino también del vector de caracteres. Los índices en los elementos de un mapa se llaman claves. Estas claves, junto con los valores de datos asociados con ellas, se almacenan dentro del Mapa.

  • Las series temporales son vectores de datos muestreados a lo largo del tiempo, en orden, a menudo a intervalos regulares. Es útil para almacenar los datos conectados con pasos de tiempo y tiene muchos métodos útiles para trabajar.

Hola Mundo

Abra un nuevo documento en blanco en el editor de MATLAB (en las versiones recientes de MATLAB, haga clic en la pestaña Inicio de la barra de herramientas y haga clic en Nueva secuencia de comandos). El atajo de teclado predeterminado para crear un nuevo script es Ctrl-n .

Alternativamente, al escribir edit myscriptname.m se abrirá el archivo myscriptname.m para editarlo, u ofrecerá crear el archivo si no existe en la ruta de MATLAB.

En el editor, escriba lo siguiente:

disp('Hello, World!');
 

Seleccione la pestaña Editor de la barra de herramientas y haga clic en Guardar como. Guarde el documento en un archivo en el directorio actual llamado helloworld.m . Al guardar un archivo sin título aparecerá un cuadro de diálogo para nombrar el archivo.

En la ventana de comandos de MATLAB, escriba lo siguiente:

>> helloworld
 

Debería ver la siguiente respuesta en la ventana de comandos de MATLAB:

Hello, World!
 

Vemos que, en la ventana de comandos, podemos escribir los nombres de las funciones o los archivos de script que hemos escrito, o que se incluyen con MATLAB, para ejecutarlos.

Aquí, hemos ejecutado el script 'helloworld'. Observe que escribir la extensión ( .m ) no es necesario. Las instrucciones contenidas en el archivo de comandos son ejecutadas por MATLAB, aquí se imprime '¡Hola, mundo!' utilizando la función disp .

Los archivos de script se pueden escribir de esta manera para guardar una serie de comandos para su uso (re) posterior.

Ayudandote

MATLAB viene con muchos scripts y funciones incorporados que van desde la simple multiplicación de herramientas de reconocimiento de imágenes. Para obtener información sobre una función que desea utilizar, escriba: help functionname en la línea de comandos. Tomemos como ejemplo la función de help .

La información sobre cómo usarla se puede obtener escribiendo:

>> help help

en la ventana de comandos. Esto devolverá información del uso de la help de la función. Si la información que está buscando aún no está clara, puede probar la página de documentación de la función. Simplemente escriba:

>> doc help

en la ventana de comandos. Esto abrirá la documentación navegable en la página para obtener help función help proporciona toda la información que necesita para comprender cómo funciona la "ayuda".

Este procedimiento funciona para todas las funciones y símbolos incorporados.

Al desarrollar sus propias funciones, puede dejar que tengan su propia sección de ayuda agregando comentarios en la parte superior del archivo de funciones o justo después de la declaración de la función.

Ejemplo para una función simple multiplyby2 guardada en el archivo multiplyby2.m

function [prod]=multiplyby2(num)
% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

    prod=num*2;
end
 

o

% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

function [prod]=multiplyby2(num)
    prod=num*2;
end
 

Esto es muy útil cuando recupera su código semanas / meses / años después de haberlo escrito.

La help y la función doc proporcionan mucha información, aprender a usar esas funciones lo ayudará a progresar rápidamente y usar MATLAB de manera eficiente.

Matrices y matrices de indexación.

MATLAB permite varios métodos para indexar (acceder) elementos de matrices y matrices:

  • Indización de subíndices : donde se especifica la posición de los elementos que desea en cada dimensión de la matriz por separado.
  • Indexación lineal : donde la matriz se trata como un vector, sin importar sus dimensiones. Eso significa que usted especifica cada posición en la matriz con un solo número.
  • Indización lógica : donde se utiliza una matriz lógica (y una matriz de valores true y false ) con las dimensiones idénticas de la matriz que está intentando indexar como una máscara para especificar qué valor devolver.

Estos tres métodos ahora se explican con más detalle utilizando la siguiente matriz M 3 por 3 como ejemplo:

>> M = magic(3)

ans = 

       8    1    6
       3    5    7
       4    9    2
 

Indexación de subíndices

El método más directo para acceder a un elemento es especificar su índice fila-columna. Por ejemplo, accediendo al elemento en la segunda fila y tercera columna:

>> M(2, 3)

ans =

      7
 

El número de subíndices proporcionados coincide exactamente con el número de dimensiones que M tiene (dos en este ejemplo).

Tenga en cuenta que el orden de los subíndices es el mismo que el de la convención matemática: el índice de fila es el primero. Además, los índices de MATLAB comienzan con 1 y no con 0 como la mayoría de los lenguajes de programación.

Puede indexar varios elementos a la vez pasando un vector para cada coordenada en lugar de un solo número. Por ejemplo, para obtener la segunda fila completa, podemos especificar que queremos las columnas primera, segunda y tercera:

>> M(2, [1,2,3])

ans =

       3    5    7
 

En MATLAB, el vector [1,2,3] se crea más fácilmente usando el operador de dos puntos, es decir, 1:3 . Puedes usar esto también en la indexación. Para seleccionar una fila (o columna) completa, MATLAB proporciona un acceso directo permitiéndole simplemente especificar : Por ejemplo, el siguiente código también devolverá la segunda fila completa

>> M(2, :)

ans =

       3    5    7
 

MATLAB también proporciona un acceso directo para especificar el último elemento de una dimensión en la forma de la palabra clave end . La palabra clave end funcionará exactamente como si fuera el número del último elemento en esa dimensión. Entonces, si desea que todas las columnas de la columna 2 a la última columna, puede usar escriba lo siguiente:

>> M(2, 2:end)

ans =

       5    7
 

La indexación de subíndices puede ser restrictiva ya que no permitirá extraer valores individuales de diferentes columnas y filas; se extraerá la combinación de todas las filas y columnas.

>> M([2,3], [1,3])
ans =

       3    7
       4    2
 

Por ejemplo, la indexación de subíndices no puede extraer solo los elementos M(2,1) o M(3,3) . Para ello debemos tener en cuenta la indexación lineal.

Indexación lineal

MATLAB le permite tratar las matrices n-dimensionales como matrices unidimensionales cuando indexa usando solo una dimensión. Puedes acceder directamente al primer elemento:

>> M(1)

ans = 

       8
 

Tenga en cuenta que las matrices se almacenan en orden mayor de columnas en MATLAB, lo que significa que usted accede a los elementos bajando primero las columnas. Entonces, M(2) es el segundo elemento de la primera columna, que es 3 y M(4) será el primer elemento de la segunda columna, es decir,

>> M(4)

ans = 

        1
 

Existen funciones integradas en MATLAB para convertir los índices de subíndices en índices lineales, y viceversa: sub2ind e ind2sub respectivamente. Puede convertir manualmente los subíndices ( r , c ) en un índice lineal mediante

idx = r + (c-1)*size(M,1)
 

Para entender esto, si estamos en la primera columna, entonces el índice lineal será simplemente el índice de la fila. La fórmula anterior es válida para esto porque para c == 1 , (c-1) == 0 . En las siguientes columnas, el índice lineal es el número de fila más todas las filas de las columnas anteriores.

Tenga en cuenta que la palabra clave end todavía se aplica y ahora se refiere al último elemento de la matriz, es decir, M(end) == M(end, end) == 2 .

También puede indexar múltiples elementos utilizando la indexación lineal. Tenga en cuenta que si lo hace, la matriz devuelta tendrá la misma forma que la matriz de vectores de índice.

M(2:4) devuelve un vector de fila porque 2:4 representa el vector de fila [2,3,4] :

>> M(2:4)

ans =

        3    4    1
 

Como otro ejemplo, M([1,2;3,4]) devuelve una matriz de 2 por 2 porque [1,2;3,4] es una matriz de 2 por 2. Vea el siguiente código para convencerse:

>> M([1,2;3,4])

ans =

       8        3
       4        1
 

Tenga en cuenta que la indexación con : alone siempre devolverá un vector de columna:

>> M(:)

ans = 

        8
        3
        4
        1
        5
        9
        6
        7
        2
 

Este ejemplo también ilustra el orden en que MATLAB devuelve elementos cuando se utiliza la indexación lineal.

Indexación lógica

El tercer método de indexación es usar una matriz lógica, es decir, una matriz que contenga solo valores true o false , como una máscara para filtrar los elementos que no desea. Por ejemplo, si queremos encontrar todos los elementos de M que son mayores que 5 podemos usar la matriz lógica

>> M > 5

ans =

    1    0    1
    0    0    1
    0    1    0
 

para indexar M y devolver solo los valores que son mayores que 5 como sigue:

>> M(M > 5)

ans =

        8
        9
        6
        7
 

Si desea que estos números permanezcan en su lugar (es decir, mantenga la forma de la matriz), puede asignar el complemento lógico

>> M(~(M > 5)) = NaN

ans = 

    8      NaN    6
    NaN    NaN    7
    NaN    9      Nan
 

Podemos reducir los bloques de código complicados que contienen if for declaraciones mediante la indexación lógica.

Tome lo no vectorizado (ya reducido a un solo bucle mediante el uso de índices lineales):

for elem = 1:numel(M)
  if M(elem) > 5
    M(elem) = M(elem) - 2;
  end
end
 

Esto se puede reducir al siguiente código utilizando la indexación lógica:

idx = M > 5;
M(idx) = M(idx) - 2;
 

O incluso más corto:

M(M > 5) = M(M > 5) - 2;
 

Más sobre indexación.

Matrices de dimensiones superiores

Todos los métodos mencionados anteriormente se generalizan en n-dimensiones. Si usamos la matriz tridimensional M3 = rand(3,3,3) como ejemplo, entonces puede acceder a todas las filas y columnas del segundo segmento de la tercera dimensión escribiendo

>> M(:,:,2)
 

Puede acceder al primer elemento de la segunda porción utilizando la indexación lineal. La indexación lineal solo se moverá a la segunda división después de todas las filas y todas las columnas de la primera división. Así que el índice lineal para ese elemento es

>> M(size(M,1)*size(M,2)+1)
 

De hecho, en MATLAB, cada matriz es n-dimensional: resulta que el tamaño de la mayoría de las otras n dimensiones es uno. Entonces, si a = 2 entonces a(1) == 2 (como es de esperar), pero también a(1, 1) == 2 , al igual que a(1, 1, 1) == 2 , a(1, 1, 1, ..., 1) == 2 y así sucesivamente. Estas dimensiones "adicionales" (de tamaño 1 ), se denominan dimensiones singleton . El comando squeeze los eliminará, y uno puede usar permute para intercambiar el orden de las dimensiones (e introducir cotas singleton si es necesario).

Una matriz n-dimensional también se puede indexar utilizando un m subíndices (donde m <= n). La regla es que los primeros subíndices m-1 se comportan normalmente, mientras que el último (m'th) hace referencia a las dimensiones restantes (n-m + 1), al igual que un índice lineal haría referencia a una dimensión (n-m + 1) formación. Aquí hay un ejemplo:

>> M = reshape(1:24,[2,3,4]);
>> M(1,1)
ans =
     1
>> M(1,10)
ans =
    19
>> M(:,:)
ans =
     1     3     5     7     9    11    13    15    17    19    21    23
     2     4     6     8    10    12    14    16    18    20    22    24
 

Volviendo rangos de elementos.

Con la indexación de subíndices, si especifica más de un elemento en más de una dimensión, MATLAB devuelve cada posible par de coordenadas. Por ejemplo, si prueba M ([1,2], [1,3]), MATLAB devolverá M(1,1) y M(2,3) pero también devolverá M(1,3) y M(2,1) . Esto puede parecer poco intuitivo cuando busca los elementos para una lista de pares de coordenadas, pero considere el ejemplo de una matriz más grande, A = rand(20) (la nota A es ahora 20 -by 20 ), donde desea obtener la cuadrante superior derecho. En este caso, en lugar de tener que especificar cada par de coordenadas en ese cuadrante (y este sería 100 pares), simplemente especifique las 10 filas y las 10 columnas que desea, así que A(1:10, 11:end) . Cortar una matriz como esta es mucho más común que requerir una lista de pares de coordenadas.

En el caso de que desee obtener una lista de pares de coordenadas, la solución más sencilla es convertirla a la indexación lineal. Considere el problema donde tiene un vector de índices de columna que desea que se devuelvan, donde cada fila del vector contiene el número de columna que desea que se devuelva para la fila correspondiente de la matriz. Por ejemplo

colIdx = [3;2;1]
 

Entonces, en este caso, realmente quieres recuperar los elementos en (1,3) , (2,2) y (3,1) . Así que usando la indexación lineal:

>> colIdx = [3;2;1];
>> rowIdx = 1:length(colIdx);
>> idx = sub2ind(size(M), rowIdx, colIdx);
>> M(idx)

ans = 

        6    5    4
 

Devolviendo un elemento varias veces

Con el subíndice y la indexación lineal, también puede devolver un elemento varias veces al repetir su índice, de modo que

>> M([1,1,1,2,2,2])

ans = 

        8    8    8    3    3    3
 

Puede usar esto para duplicar filas y columnas completas, por ejemplo, para repetir la primera fila y la última columna

>> M([1, 1:end], [1:end, end])

ans = 

        8    1    6    6 
        8    1    6    6
        3    5    7    7
        4    9    2    2
 

Para más información, ver aquí .

Matrices y matrices

En MATLAB, el tipo de datos más básico es la matriz numérica. Puede ser un escalar, un vector 1-D, una matriz 2-D o una matriz multidimensional ND.

% a 1-by-1 scalar value
x = 1;
 

Para crear un vector de fila, ingrese los elementos entre corchetes, separados por espacios o comas:

% a 1-by-4 row vector
v = [1, 2, 3, 4];
v = [1 2 3 4];
 

Para crear un vector de columna, separe los elementos con punto y coma:

% a 4-by-1 column vector
v = [1; 2; 3; 4];
 

Para crear una matriz, ingresamos las filas como antes separadas por puntos y comas:

% a 2 row-by-4 column matrix
M = [1 2 3 4; 5 6 7 8];

% a 4 row-by-2 column matrix
M = [1 2; ...
     4 5; ...
     6 7; ...
     8 9];
 

Tenga en cuenta que no puede crear una matriz con un tamaño de fila / columna desigual. Todas las filas deben tener la misma longitud y todas las columnas deben tener la misma longitud:

% an unequal row / column matrix
M = [1 2 3 ; 4 5 6 7]; % This is not valid and will return an error

% another unequal row / column matrix
M = [1 2 3; ...
     4   5; ...
     6 7 8; ...
     9   10];     % This is not valid and will return an error
 

Para transponer un vector o una matriz, usamos el .' -operador, o el ' operador para tomar su conjugado hermitiano, que es el conjugado complejo de su transposición. Para matrices reales, estas dos son las mismas:

% create a row vector and transpose it into a column vector
v = [1 2 3 4].';              % v is equal to [1; 2; 3; 4];

% create a 2-by-4 matrix and transpose it to get a 4-by-2 matrix
M = [1 2 3 4; 5 6 7 8].';     % M is equal to [1 5; 2 6; 3 7; 4 8]

% transpose a vector or matrix stored as a variable
A = [1 2; 3 4];
B = A.';                      % B is equal to [1 3; 2 4]
 

Para matrices de más de dos dimensiones, no hay sintaxis de lenguaje directo para ingresarlas literalmente. En su lugar, debemos usar funciones para construirlas (como ones , zeros , rand ) o mediante la manipulación de otras matrices (usando funciones como cat , reshape , permute ). Algunos ejemplos:

% a 5-by-2-by-4-by-3 array (4-dimensions)
arr = ones(5, 2, 4, 3);

% a 2-by-3-by-2 array (3-dimensions)
arr = cat(3, [1 2 3; 4 5 6], [7 8 9; 0 1 2]);

% a 5-by-4-by-3-by-2 (4-dimensions)
arr = reshape(1:120, [5 4 3 2]);
 

Lectura de entrada y escritura de salida

Al igual que todo lenguaje de programación, Matlab está diseñado para leer y escribir en una gran variedad de formatos. La biblioteca nativa admite una gran cantidad de formatos de texto, imagen, video, audio y datos con más formatos incluidos en cada actualización de versión. Consulte aquí para ver la lista completa de formatos de archivo admitidos y qué función usar para importarlos.

Antes de intentar cargar en su archivo, debe preguntarse en qué desea que se conviertan los datos y cómo espera que la computadora organice los datos para usted. Digamos que tienes un archivo txt / csv en el siguiente formato:

Fruit,TotalUnits,UnitsLeftAfterSale,SellingPricePerUnit
Apples,200,67,$0.14
Bananas,300,172,$0.11
Pineapple,50,12,$1.74
 

Podemos ver que la primera columna está en el formato de Cadenas, mientras que la segunda, la tercera es numérica, la última columna está en la forma de moneda. Digamos que queremos encontrar la cantidad de ingresos que obtuvimos hoy con Matlab y primero queremos cargar en este archivo txt / csv. Después de comprobar el enlace, podemos ver que la cadena y el tipo numérico de archivos txt son manejados por textscan . Así podríamos intentar:

fileID = fopen('dir/test.txt'); %Load file from dir
C = textscan(fileID,'%s %f %f %s','Delimiter',',','HeaderLines',1); %Parse in the txt/csv
 

donde %s sugiere que el elemento es un tipo de cadena, %f sugiere que el elemento es un tipo flotante, y que el archivo está delimitado por ",". La opción HeaderLines le pide a Matlab que se salte las primeras N líneas mientras que la 1 inmediatamente después significa que se salte la primera línea (la línea del encabezado).

Ahora C es la información que hemos cargado, que tiene la forma de una matriz de celdas de 4 celdas, cada una de las cuales contiene la columna de datos en el archivo txt / csv.

Entonces, primero queremos calcular cuántas frutas vendimos hoy al restar la tercera columna de la segunda columna, esto se puede hacer de la siguiente manera:

sold = C{2} - C{3}; %C{2} gives the elements inside the second cell (or the second column)
 

Ahora queremos multiplicar este vector por el Precio por unidad, así que primero debemos convertir esa columna de Cadenas en una columna de Números, luego convertirla en una Matriz Numérica usando el cell2mat de Matlab. cell2mat primero que debemos hacer es eliminar. fuera del signo "$", hay muchas maneras de hacer esto. La forma más directa es usando un regex simple:

D = cellfun(@(x)(str2num(regexprep(x, '\$',''))), C{4}, 'UniformOutput', false);%cellfun allows us to avoid looping through each element in the cell.
 

O puedes usar un bucle:

for t=1:size(C{4},1)
   D{t} = str2num(regexprep(C{4}{t}, '\$',''));
end

E = cell2mat(D)% converts the cell array into a Matrix
 

La función str2num convierte la cadena con los signos "$" en tipos numéricos y cell2mat convierte la celda de elementos numéricos en una matriz de números.

Ahora podemos multiplicar las unidades vendidas por el costo por unidad:

revenue = sold .* E; %element-wise product is denoted by .* in Matlab

totalrevenue = sum(revenue);
 

Scripts y Funciones

El código MATLAB se puede guardar en archivos m para reutilizarlo. Los archivos m tienen la extensión .m que se asocia automáticamente con MATLAB. Un archivo-M puede contener una secuencia de comandos o funciones.

Guiones

Los scripts son simplemente archivos de programa que ejecutan una serie de comandos MATLAB en un orden predefinido.

Los scripts no aceptan entradas, ni los scripts devuelven resultados. Funcionalmente, los scripts son equivalentes a escribir comandos directamente en la ventana de comandos de MATLAB y poder reproducirlos.

Un ejemplo de un script:

length = 10;
width = 3;
area = length * width;
 

Este script definirá la length , el width y el area en el espacio de trabajo actual con el valor 10 , 3 y 30 respectivamente.

Como se indicó anteriormente, el script anterior es funcionalmente equivalente a escribir los mismos comandos directamente en la ventana de comandos.

>> length = 10;
>> width = 3;
>> area = length * width;
 

Funciones

Las funciones, en comparación con los scripts, son mucho más flexibles y extensibles. A diferencia de los scripts, las funciones pueden aceptar entrada y devolver la salida a la persona que llama. Una función tiene su propio espacio de trabajo, lo que significa que las operaciones internas de las funciones no cambiarán las variables del llamante.

Todas las funciones se definen con el mismo formato de encabezado:

function [output] = myFunctionName(input)
 

La palabra clave de function comienza cada encabezado de función. La lista de salidas sigue. La lista de resultados también puede ser una lista de variables separadas por comas para devolver.

function [a, b, c] = myFunctionName(input)
 

El siguiente es el nombre de la función que se utilizará para llamar. Este es generalmente el mismo nombre que el nombre de archivo. Por ejemplo, guardaríamos esta función como myFunctionName.m .

Después del nombre de la función está la lista de entradas. Al igual que las salidas, esta también puede ser una lista separada por comas.

function [a, b, c] = myFunctionName(x, y, z)
 

Podemos reescribir el script de ejemplo de antes como una función reutilizable como la siguiente:

function [area] = calcRecArea(length, width)
   area = length * width;
end
 

Podemos llamar a funciones desde otras funciones, o incluso desde archivos de script. Este es un ejemplo de nuestra función anterior que se utiliza en un archivo de script.

l = 100;
w = 20;
a = calcRecArea(l, w);
 

Como antes, creamos l , w y a en el espacio de trabajo con los valores de 100 , 20 y 2000 respectivamente.