Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

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, diríjase a la pestaña Home (Inicio), en la sección Environment (Entorno), y 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