Primeros pasos con el lenguaje MATLAB

Indexación de matrices y arreglos

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

  • Indización de subíndices - donde especifica la posición de los elementos que desea en cada dimensión de la matriz por separado.
  • Indización lineal - donde la matriz se trata como un vector, sin importar sus dimensiones. Eso significa que especifica cada posición en la matriz con un solo número.
  • Indización lógica - donde utiliza una matriz lógica (y una matriz de valores verdadero y falso) con las mismas dimensiones de la matriz que intenta 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 de 3 por 3 M 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 tiene M (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 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 utilizando el operador de dos puntos, es decir, 1:3. También puede usar esto en la indexación. Para seleccionar una fila (o columna) completa, MATLAB proporciona un atajo al permitirle 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 atajo para especificar el último elemento de una dimensión en forma de 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 todas las columnas desde la columna 2 hasta la última columna, puede escribir lo siguiente:

>> M(2, 2:end)

ans =

       5    7

La indexación de subíndices puede ser restrictiva ya que no permitirá extraer valores únicos de diferentes columnas y filas; 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 considerar la indexación lineal.

Indexación lineal

MATLAB le permite tratar arreglos n-dimensionales como arreglos unidimensionales cuando indexa utilizando solo una dimensión. Puede acceder directamente al primer elemento:

>> M(1)

ans = 

       8

Tenga en cuenta que las matrices se almacenan en [orden principal de columna] 1 en MATLAB, lo que significa que accede a los elementos bajando primero por 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 índices de subíndices en índices lineales y viceversa: sub2ind y ind2sub respectivamente. Puede convertir manualmente los subíndices (r,c) en un índice lineal

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

Para entender esto, si estamos en la primera columna, 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 (fin) == M (fin, fin) == 2.

También puede indexar varios elementos mediante la indexación lineal. Tenga en cuenta que si hace eso, 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] también es una matriz de 2 por 2. Vea el siguiente código para convencerse a sí mismo:

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

ans =

       8        3
       4        1

Tenga en cuenta que la indexación con : solo 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 los 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 contiene solo valores “verdaderos” o “falsos”, 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 de la siguiente manera:

>> M(M > 5)

ans =

        8
        9
        6
        7

Si quisiera que estos números permanecieran en su lugar (es decir, mantener la forma de la matriz), entonces podría asignar al 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 declaraciones if y for utilizando la indexación lógica.

Tome el no vectorizado (ya acortado a un solo bucle mediante el uso de indexación lineal):

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

Esto se puede acortar al siguiente código usando 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 la indexación

Matrices de mayor dimensión

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

>> M(:,:,2)

Puede acceder al primer elemento de la segunda rebanada mediante la indexación lineal. La indexación lineal solo pasará al segundo sector después de todas las filas y todas las columnas del primer sector. Así que el índice lineal para ese elemento es

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

De hecho, en MATLAB, todas las matrices son n-dimensionales: 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 cabría 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 conocen como dimensiones singleton. El comando squeeze los eliminará, y uno puede usar permute para intercambiar el orden de las dimensiones (e introducir dimensiones singleton si es necesario).

Una matriz n-dimensional también se puede indexar utilizando m subíndices (donde m<=n). La regla es que los primeros subíndices m-1 se comportan normalmente, mientras que el último (m-ésimo) subíndice hace referencia a las dimensiones restantes (n-m+1), tal como un índice lineal haría referencia a un índice dimensional (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

Retorno de 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 está buscando los elementos para una lista de pares de coordenadas, pero considere el ejemplo de una matriz más grande, A = rand (20) (observe que A ahora es 20 por 20 ), donde desea obtener el cuadrante superior derecho. En este caso, en lugar de tener que especificar cada par de coordenadas en ese cuadrante (y en este caso serían ‘100’ pares), simplemente especifica las ‘10’ filas y las ‘10’ columnas que desea, de modo que ‘A(1: 10, 11:fin)`. 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 simple es convertir a indexación lineal. Considere el problema en el que tiene un vector de índices de columna que desea devolver, donde cada fila del vector contiene el número de columna que desea devolver para la fila correspondiente de la matriz. Por ejemplo

colIdx = [3;2;1]

Entonces, en este caso, realmente desea 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

Devolver un elemento varias veces

Con la indexación de subíndices y lineales, también puede devolver un elemento varias veces repitiendo su índice para 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 obtener más información, consulte aquí.

Funciones anónimas y identificadores de funciones

Lo esencial

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

El operador @

Utilice el operador @ para crear funciones anónimas y identificadores de funciones. Por ejemplo, para crear un controlador para la función sin (seno) y usarla como f:

>> f = @sin
f = 
    @sin

Ahora f es un identificador de la función 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 función. Para usar f, se le pasan argumentos 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 fuera una función que acepta cero argumentos de entrada (lo que no hace, pero otros sí, por ejemplo, la función peaks), se usaría f() 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 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 otro modo, tendrían que repetirse varias veces o crear una función separada para ellas. 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ó usando 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

También se puede pasar un vector de valores o una variable a f, siempre que se utilicen de forma 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 espacio de trabajo se pueden usar dentro de la definición de funciones anónimas. Esto se llama parametrizar. 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á 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 espacio de trabajo

Tenga en cuenta que usar el nombre de las variables en el espacio 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 cambio, 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 el contenido del otro. 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 se dejó intacto. Dentro del alcance de f, los nombres de variables entre paréntesis después del operador @ son independientes de las principales variables del espacio de trabajo.

Las funciones anónimas se almacenan en variables

Una función anónima (o, más precisamente, el identificador 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 se puede tratar como cualquier otro valor. Cuando se almacena en una variable, tiene un nombre en el espacio de trabajo actual y se puede cambiar y borrar como las variables que contienen números.

Dicho de otra manera: el identificador de una función (ya sea en la forma @sin o para una función anónima) es simplemente un valor que se puede almacenar en una variable, al igual que una matriz numérica.

Uso avanzado

Pasar identificadores de funciones a otras funciones

Dado que los identificadores de función se tratan como variables, se pueden pasar a funciones que acepten identificadores de función como argumentos de entrada.

Un ejemplo: se crea una función en un archivo m que acepta un identificador de función y un número escalar. Luego llama al identificador 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, p. 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 fue una forma rápida de acceder a la función sin sin almacenarla primero en una variable usando 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 de forma elemento por elemento. Normalmente, esto requeriría el uso de bucles for, que a menudo requieren una preasignación de 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 tarda 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

Ejecutar el ejemplo anterior da como resultado 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. Se podría haber especificado una función o identificador anónimo diferente (@) a cualquier otra función, siempre que acepte A y mean(A) como entradas 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 puede ser más difícil de interpretar para las personas que no conocen MATLAB o bsxfun. (Tenga en cuenta que en MATLAB R2016a y versiones posteriores, muchas operaciones que antes usaban bsxfun ya no las necesitan; A-mean(A) funciona directamente y, en algunos casos, puede ser incluso más rápida).

Matrices y arreglos

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 N-D.

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

Para crear un vector de fila, ingrese los elementos entre paréntesis, 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 punto y coma:

% 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 transpuesta. Para matrices reales, estos dos son iguales:

% 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 arreglos de más de dos dimensiones, no hay una sintaxis de lenguaje directo para ingresarlos literalmente. En su lugar, debemos usar funciones para construirlos (como unos, ceros, rand) o manipulando 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]);

Arreglos de celdas

Los elementos de la misma clase a menudo se pueden concatenar en matrices (con algunas raras excepciones, por ejemplo, identificadores de función). Los escalares numéricos, por defecto de clase doble, se pueden almacenar 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 la clase char en MATLAB, también se pueden almacenar en una matriz utilizando una sintaxis similar. Tal 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 usan corchetes [ y ], las clases de resultados son diferentes. Por lo tanto, las operaciones que se pueden hacer sobre 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 estuviera definido por cualquiera 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 combinación de variables de diferentes clases o algunas cadenas diferentes. Aquí es donde la matriz 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. Utilice 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 estándar de MATLAB 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 su contenido.

El acceso al contenido de una celda se realiza mediante 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 la clase ‘doble’ 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 celdas de 10 por 5, entonces D(4:8,1:3) devolvería una sub-matriz de D cuyo tamaño es de 5 por 3 y cuya clase es celda . Y la sintaxis C{1:2} no tiene un solo objeto devuelto, pero el evaluador devuelve 2 objetos diferentes (similar a una función de 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

Hola Mundo

Abra un nuevo documento en blanco en el editor de MATLAB (en versiones recientes de MATLAB, haga esto seleccionando la pestaña Inicio de la barra de herramientas y haciendo clic en Nuevo script). El método abreviado de teclado predeterminado para crear un nuevo script es Ctrl-n.

Alternativamente, al escribir editar 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, escribe lo siguiente:

disp('Hello, World!');

Seleccione la pestaña Editor de la tira 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 funciones o archivos de script que hemos escrito, o que se envían con MATLAB, para ejecutarlos.

Aquí, hemos ejecutado el script ‘helloworld’. Tenga en cuenta que no es necesario escribir la extensión (.m). Las instrucciones contenidas en el archivo de script son ejecutadas por MATLAB, aquí imprimiendo ‘¡Hola, mundo!’ usando la función disp.

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

Ayudándote a ti mismo

MATLAB viene con muchos scripts y funciones integrados que van desde la simple multiplicación hasta cajas 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 comando. Tomemos como ejemplo la función ayuda.

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

>> ayuda ayuda

en la ventana de comandos. Esto devolverá información sobre el uso de la función ayuda. 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:

>> ayuda doc

en la ventana de comandos. Esto abrirá la documentación navegable en la página para la función ayuda proporcionando toda la información que necesita para entender cómo funciona la ‘ayuda’.

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

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

Ejemplo de 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 recoges tu código semanas/meses/años después de haberlo escrito.

Las funciones help y doc brindan mucha información; aprender a usar esas funciones lo ayudará a progresar rápidamente y usar MATLAB de manera eficiente.

Scripts y funciones

El código de MATLAB se puede guardar en archivos m para su reutilización. Los archivos m tienen la extensión .m que se asocia automáticamente con MATLAB. Un archivo m puede contener un script o funciones.

Guiones

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

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

Un ejemplo de un guión:

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

Este script definirá longitud, ancho y área 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 entradas y devolver salidas a la persona que llama. Una función tiene su propio espacio de trabajo, esto significa que las operaciones internas de las funciones no cambiarán las variables de la persona que llama.

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

function [output] = myFunctionName(input)

La palabra clave función comienza cada encabezado de función. La lista de salidas sigue. La lista de salidas 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 usará para llamar. Este es generalmente el mismo nombre que el nombre del 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, también puede ser una lista separada por comas.

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

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

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

Podemos llamar funciones desde otras funciones, o incluso desde archivos de script. Aquí hay un ejemplo de nuestra función anterior que se usa 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.

Entrada de lectura y salida de escritura

Como 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í] 1 para ver la lista completa de formatos de archivo compatibles y qué función usar para importar a ellos.

Antes de intentar cargar su archivo, debe preguntarse en qué desea que se conviertan los datos y cómo espera que la computadora organice los datos por usted. Digamos que tiene 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 tiene el formato de Cadenas, mientras que la segunda, la tercera son Numéricas, la última columna tiene la forma de Moneda. Digamos que queremos saber cuántos ingresos obtuvimos hoy usando Matlab y primero queremos cargar este archivo txt/csv. Después de verificar el enlace, podemos ver que los tipos de archivos txt de cadena y numéricos son manejados por textscan. Así que 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 de tipo Cadena, %f sugiere que el elemento es de tipo Flotante y que el archivo está delimitado por “,”. La opción HeaderLines le pide a Matlab que omita las primeras N líneas, mientras que el 1 inmediatamente después significa omitir la primera línea (la línea del encabezado).

Ahora C son los datos que hemos cargado, que tienen 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 restando 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 cell2mat de Matlab. Lo primero que debemos hacer es quita el signo “$”, hay muchas formas de hacerlo. La forma más directa es usar una expresión regular 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 que tenía los signos “$” separados 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);

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 arreglo. Con la excepción de los identificadores de funciones, esta matriz o matriz tiene un tamaño mínimo de 0 por 0 y puede crecer hasta convertirse en una matriz n-dimensional de cualquier tamaño. Un identificador de función siempre es escalar (1 por 1).

Un momento importante en MATLAB es que no necesita usar ninguna declaración de tipo o declaraciones de dimensión por defecto. 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 un nuevo espacio de almacenamiento si es necesario.

Tipos de datos fundamentales

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

Tipos de datos numéricos:

MATLAB representa números de coma flotante en formato de doble precisión o precisión simple. El valor predeterminado es precisión doble, pero puede convertir cualquier número en precisión simple 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     

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

MATLAB admite 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 número entero, debe convertir de doble al tipo de número entero deseado. Si el número que se convierte 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);

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: valores lógicos de 1 o 0, representan verdadero y falso respectivamente. Úselo para condiciones relacionales e indexación de matrices. Debido a que 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 utilizando la notación de puntos de la forma structName.fieldName.

     field1 = 'first';
     field2 = 'second';
     value1 = [1 2 3 4 5];
     value2 = 'sometext';
     s = struct(field1,value1,field2,value2);
    
    In order to access value1, each of the following syntax are equivalent 
    
     s.first or s.(field1) or s.('first')
    We can explicitly access a field we know will exist with the first method, or either pass a string or create a string to access the field in the second example.  The third example is demostrating that the dot parenthases notation takes a string, which is the same one stored in the field1 variable.
    
  • las variables de la tabla pueden tener 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 un tipo de datos de MATLAB muy útil: la matriz de celdas es una matriz en la que cada elemento puede tener un tipo y tamaño de datos diferente. Es un instrumento muy fuerte para manipular datos como desee.

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

    or

     a = cell(3);
    
  • manejadores de función almacena un puntero a una función (por ejemplo, a una 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 de conversión de tipo de datos integradas (str2double, table2cell).

Tipos de datos adicionales

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

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

  • Arreglos categóricos: es un 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 de indexación no solo a través de valores numéricos escalares sino también de vectores de caracteres. Los índices de los elementos de un mapa se denominan claves. Estas claves, junto con los valores de datos asociados con ellas, se almacenan dentro del Mapa.

  • 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 relacionados con los intervalos de tiempo y tiene muchos métodos útiles para trabajar.