Tipos de arreglos
Arreglos multidimensionales
En el entorno de MATLAB®, los arreglos multidimensionales son aquellos con más de dos subíndices. Una forma de crear un arreglo multidimensional es llamando a las funciones zeros
, ones
, rand
o randn
con más de dos argumentos. Por ejemplo,
R = randn(3,4,5);
crea un arreglo de 3 por 4 por 5 con un total de 3*4*5 = 60
elementos aleatorios distribuidos de manera normal.
Un arreglo tridimensional podría representar datos físicos tridimensionales como, por ejemplo, la temperatura en una sala, muestreados en una cuadrícula rectangular. O bien podría representar una secuencia de matrices, A(k), o muestras de una matriz dependiente del tiempo, A(t). En estos últimos casos, el (i, j)-ésimo elemento de la k-ésima matriz, o la tk-ésima matriz, se indica mediante A(i,j,k)
.
Las versiones de MATLAB y de Durero del cuadrado mágico de orden 4 se diferencian por un intercambio de dos columnas. Con el intercambio de columnas, se pueden generar muchos cuadrados mágicos diferentes. La instrucción
p = perms(1:4);
genera las 4! = 24 permutaciones de 1:4
. La k
-ésima permutación es el vector fila p(k,:)
. Entonces,
A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:)); end
almacena la secuencia de 24 cuadrados mágicos en un arreglo tridimensional, M
. El tamaño de M
es
size(M) ans = 4 4 24
Nota
El orden de las matrices que se muestran en esta ilustración podría ser diferente al de sus resultados. La función perms
siempre devuelve todas las permutaciones del vector de entrada, pero el orden de las permutaciones puede ser diferente para distintas versiones de MATLAB.
La instrucción
sum(M,d)
calcula sumas mediante la variación del d
-ésimo subíndice. Por lo tanto,
sum(M,1)
es un arreglo de 1 por 4 por 24 que contiene 24 copias del vector fila
34 34 34 34
y
sum(M,2)
es un arreglo de 4 por 1 por 24 que contiene 24 copias del vector columna
34 34 34 34
Finalmente,
S = sum(M,3)
agrega las 24 matrices de la secuencia. El resultado tiene un tamaño de 4 por 4 por 1, por lo que se ve como un arreglo de 4 por 4:
S = 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204
Arreglos de celdas
En MATLAB, los arreglos de celdas son arreglos multidimensionales cuyos elementos son copias de otros arreglos. Se puede crear un arreglo de celdas de matrices vacías con la función cell
. Sin embargo, con más frecuencia, los arreglos de celdas se crean encerrando una colección variada de cosas entre llaves, {}
. Las llaves también se utilizan con subíndices para acceder al contenido de diversas celdas. Por ejemplo:
C = {A sum(A) prod(prod(A))}
produce un arreglo de celdas de 1 por 3. Las tres celdas contienen el cuadrado mágico, el vector fila de sumas de columnas y el producto de todos sus elementos. Cuando se muestra C
, se ve
C = [4x4 double] [1x4 double] [20922789888000]
Esto se debe a que las dos primeras celdas son demasiado grandes para imprimirse en este espacio limitado, pero la tercera celda contiene solo un número único, 16!, por lo que hay espacio para imprimirlo.
Los siguientes son dos puntos importantes que hay que recordar. Primero, para recuperar el contenido de una de las celdas, use subíndices entre llaves. Por ejemplo, C{1}
recupera el cuadrado mágico y C{3}
es igual a 16!. Segundo, los arreglos de celdas contienen copias de otros arreglos, no punteros a esos arreglos. Si posteriormente decide cambiar A
, C
permanece intacto.
Los arreglos tridimensionales se pueden usar para almacenar secuencias de matrices del mismo tamaño. Los arreglos de celdas se pueden usar para almacenar secuencias de matrices de diferentes tamaños. Por ejemplo,
M = cell(8,1); for n = 1:8 M{n} = magic(n); end M
produce una secuencia de cuadrados mágicos de diferente orden:
M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]
Se puede recuperar la matriz del cuadrado mágico de 4 por 4 con
M{4}
Caracteres y texto
Introduzca texto en MATLAB usando comillas simples. Por ejemplo:
s = 'Hello'
El resultado no es el mismo tipo de arreglo o matriz numérica con los que ha trabajado hasta ahora. Es un arreglo de caracteres de 1 por 5.
De manera interna, los caracteres se almacenan como números, pero no en formato de punto flotante. La instrucción
a = double(s)
convierte el arreglo de caracteres en una matriz numérica que contiene representaciones en punto flotante de los códigos ASCII para cada carácter. El resultado es el siguiente:
a = 72 101 108 108 111
La instrucción
s = char(a)
revierte la conversión.
La conversión de números a caracteres permite investigar las diversas fuentes tipográficas disponibles en su ordenador. Los caracteres imprimibles en el conjunto de caracteres ASCII básicos están representados por los enteros 32:127
. (Los enteros menores a 32 representan caracteres de control no imprimibles). Estos enteros se disponen en un arreglo apropiado de 6 por 16 con
F = reshape(32:127,16,6)';
Los caracteres imprimibles en el conjunto de caracteres ASCII extendido están representados por F+128
. Cuando estos enteros se interpretan como caracteres, el resultado depende de la fuente que se esté usando. Escriba las instrucciones
char(F) char(F+128)
y luego cambie la fuente que esté utilizando para la ventana de comandos. Para cambiar la fuente, en la pestaña Home, en la sección Environment, haga clic en Preferences > Fonts. Si incluye tabuladores en líneas de código, use una fuente de ancho fijo, como Monospaced
, para alinear las posiciones de los tabuladores en líneas diferentes.
La concatenación con corchetes une variables de texto. La instrucción
h = [s, ' world']
une los caracteres de manera horizontal y produce lo siguiente:
h = Hello world
La instrucción
v = [s; 'world']
une los caracteres de forma vertical y produce lo siguiente:
v = Hello world
Tenga en cuenta que se tiene que insertar un espacio en blanco antes de la 'w'
en h
y que ambas palabras en v
tienen que tener la misma longitud. Los arreglos resultantes son arreglos de caracteres; h
es de 1 por 11 y v
es de 2 por 5.
Para manipular un cuerpo de texto que contiene líneas de diferentes longitudes, tiene dos opciones: un arreglo de caracteres con relleno o un arreglo de celdas de vectores de caracteres. Cuando se crea un arreglo de caracteres, es necesario que cada fila del arreglo tenga la misma longitud. (Para lograrlo, rellene los extremos de las filas más cortas con espacios). La función char
hace este relleno por usted. Por ejemplo,
S = char('A','rolling','stone','gathers','momentum.')
produce un arreglo de caracteres de 5 por 9:
S = A rolling stone gathers momentum.
De manera alternativa, se puede almacenar el texto en un arreglo de celdas. Por ejemplo,
C = {'A';'rolling';'stone';'gathers';'momentum.'}
crea un arreglo de celdas de 5 por 1 que no requiere relleno, ya que cada fila del arreglo puede tener una longitud diferente:
C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'
Se puede convertir un arreglo de caracteres de relleno en un arreglo de celdas de vectores de caracteres con
C = cellstr(S)
y revertir el proceso con
S = char(C)
Estructuras
Las estructuras son arreglos multidimensionales de MATLAB con elementos a los que se accede mediante designadores de campo textuales. Por ejemplo,
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
crea una estructura escalar con tres campos:
S = name: 'Ed Plum' score: 83 grade: 'B+'
Al igual que todo lo demás en el entorno de MATLAB, las estructuras son arreglos, por lo que es posible insertar elementos adicionales. En este caso, cada elemento del arreglo es una estructura con varios campos. Los campos se pueden agregar uno por uno,
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
o se puede agregar un elemento completo con una sola instrucción:
S(3) = struct('name','Jerry Garcia',... 'score',70,'grade','C')
Ahora la estructura es lo suficientemente grande como para que solo se imprima un resumen:
S = 1x3 struct array with fields: name score grade
Existen varias formas de reagrupar los diversos campos en otros arreglos de MATLAB. Estas se basan principalmente en la notación de una lista separada por comas. Si escribe
S.score
es lo mismo que escribir
S(1).score, S(2).score, S(3).score
que es una lista separada por comas.
Si encierra entre corchetes la expresión que genera dicha lista, MATLAB almacena cada elemento de la lista en un arreglo. En este ejemplo, MATLAB crea un vector fila numérico que contiene el campo score
de cada elemento del arreglo de estructura S
:
scores = [S.score] scores = 83 91 70 avg_score = sum(scores)/length(scores) avg_score = 81.3333
Para crear un arreglo de caracteres a partir de uno de los campos de texto (por ejemplo, name
), llame a la función char
en la lista separada por comas producida por S.name
:
names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia
De manera similar, para crear un arreglo de celdas a partir del campo name
, encierre entre llaves la expresión generadora de la lista:
names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'
Para asignar los campos de cada elemento de un arreglo de estructura a variables separadas fuera de la estructura, especifique cada variable a la izquierda del signo igual y enciérrelas todas entre corchetes:
[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
Nombres de campo dinámicos
La forma más común de acceder a los datos de una estructura es especificando el nombre del campo al que desea hacer referencia. Otra manera de acceder a los datos de la estructura es usando nombres de campos dinámicos. Estos nombres expresan el campo como una expresión variable que MATLAB evalúa en el tiempo de ejecución. La sintaxis de paréntesis con punto que se muestra a continuación permite que expression
sea un nombre de campo dinámico:
structName.(expression)
Haga una indexación en este campo utilizando la sintaxis de indexación estándar de MATLAB. Por ejemplo, para evaluar expression
en un nombre de campo y obtener los valores de ese campo en las columnas 1
a 25
de la fila 7
, utilice:
structName.(expression)(7,1:25)
Ejemplos de nombres de campo dinámicos. La función avgscore
que se muestra a continuación recupera información de la estructura testscores
mediante el uso de nombres de campo dinámicos y usa esa información para calcular una puntuación de prueba promedio:
function avg = avgscore(testscores, student, first, last) for k = first:last scores(k) = testscores.(student).week(k); end avg = sum(scores)/(last - first + 1);
Esta función se puede ejecutar usando valores diferentes para el campo dinámico student
. Primero, inicialice la estructura que contiene puntuaciones para un período de 25 semanas:
testscores.Ann_Lane.week(1:25) = ... [95 89 76 82 79 92 94 92 89 81 75 93 ... 85 84 83 86 85 90 82 82 84 79 96 88 98]; testscores.William_King.week(1:25) = ... [87 80 91 84 99 87 93 87 97 87 82 89 ... 86 82 90 98 75 79 92 84 90 93 84 78 81];
Ahora ejecute avgscore
. Para ello, deberá proporcionar los campos de nombres de estudiantes para la estructura testscores
en el tiempo de ejecución mediante el uso de nombres de campo dinámicos:
avgscore(testscores, 'Ann_Lane', 7, 22) ans = 85.2500 avgscore(testscores, 'William_King', 7, 22) ans = 87.7500