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.

Vectorización

Uso de la vectorizacion

MATLAB® está optimizado para operaciones que involucren matrices y vectores. El proceso de revisión de código basado en bucle, escalar orientado a utilizar MATLAB matriz y operaciones vectoriales se llama vectorización. Vectorizar su código vale por varias razones:

  • Aspecto: El código matemático vectorizado aparece más como las expresiones matemáticas encontradas en los libros de texto, haciendo que el código sea más fácil de entender.

  • Menos propenso a errores: Sin bucles, el código vectorizado es a menudo más corto. Menos líneas de código significan menos oportunidades para introducir errores de programación.

  • Rendimiento: El código vectorial suele correr mucho más rápido que el código correspondiente que contiene bucles.

Vectorización de código para la informática general

Este código computa el seno de 1.001 valores que van de 0 a 10:

i = 0; for t = 0:.01:10     i = i + 1;     y(i) = sin(t); end

Esta es una versión vectorizada del mismo código:

t = 0:.01:10; y = sin(t);

La segunda muestra de código normalmente se ejecuta más rápido que la primera y es un uso más eficiente de MATLAB. Pruebe la velocidad de ejecución en el sistema creando secuencias de comandos que contengan el código mostrado y, a continuación, utilice las funciones tic y toc para medir su tiempo de ejecución.

Vectorización de código para tareas específicas

Este código computa la suma acumulativa de un vector en cada quinto elemento:

x = 1:10000; ylength = (length(x) - mod(length(x),5))/5; y(1:ylength) = 0; for n= 5:5:length(x)     y(n/5) = sum(x(1:n)); end 

Usando la vectorizacion, puedes escribir un proceso de MATLAB mucho mas conciso. Este código muestra una forma de realizar la tarea:

x = 1:10000; xsums = cumsum(x); y = xsums(5:5:length(x)); 

Operaciones de matrices

Los operadores de matrices realizan la misma operación para todos los elementos del conjunto de datos. Estos tipos de operaciones son útiles para cálculos repetitivos. Por ejemplo, suponga que usted recoge el volumen (V) de varios Conos Registrando su diámetro (D) y altura (H). Si recoge la información para un solo cono, puede calcular el volumen para ese cono único:

V = 1/12*pi*(D^2)*H;

Ahora, recoge información sobre 10.000 conos. Los vectores D y H cada uno contienen 10.000 elementos, y se quiere calcular 10.000 volúmenes. En la mayoría de los lenguajes de programación, es necesario configurar un bucle similar a este código MATLAB:

for n = 1:10000    V(n) = 1/12*pi*(D(n)^2)*H(n)); end

Con MATLAB, puede realizar el cálculo para cada elemento de un vector con sintaxis similar como el caso escalar:

% Vectorized Calculation V = 1/12*pi*(D.^2).*H;

Nota

La colocación de un período (.) antes de que los operadores *, / y ^, los transforma en operadores de matrices.

Los operadores de matrices también le permiten combinar matrices de diferentes dimensiones. Esta expansión automática de dimensiones size-1 es útil para vectorizar la creación de redes, las operaciones matriciales y vectoriales, y más.

Suponga que Matrix A representa puntuaciones de prueba, cuyas filas denotan diferentes clases. Desea calcular la diferencia entre la puntuación promedio y las puntuaciones individuales de cada clase. Usando un bucle, la operación se ve como:

A = [97 89 84; 95 82 92; 64 80 99;76 77 67;...  88 59 74; 78 66 87; 55 93 85];  mA = mean(A); B = zeros(size(A)); for n = 1:size(A,2)     B(:,n) = A(:,n) - mA(n); end

Una manera más directa de hacer esto es con A - mean(A), que evita la necesidad de un bucle y es significativamente más rápido.

 devA = A - mean(A)
devA =      18    11     0     16     4     8    -15     2    15     -3    -1   -17      9   -19   -10     -1   -12     3    -24    15     1

A pesar de que A es una matriz de 7 por 3 y mean(A) es un vector 1-por-3, MATLAB implícitamente expande el vector como si tuviera el mismo tamaño que la matriz, y la operación se ejecuta como un elemento normal-Wise menos operación.

El requisito de tamaño para los operandos es que para cada dimensión, las matrices deben tener el mismo tamaño o una de ellas es 1. Si se cumple este requisito, las cotas en las que uno de los arrays tiene el tamaño 1 se expanden para tener el mismo tamaño que la dimensión correspondiente en la otra matriz. Para obtener más información, vea Tamaños de matrices compatibles para operaciones básicas.

Otra área donde la expansión implícita es útil para la vectorización es si está trabajando con datos multidimensionales. Suponga que desea evaluar una función, F, de dos variables, x y y.

F(x,y) = x*exp(-x2 - y2)

Para evaluar esta función en cada combinación de puntos en los vectores x y y, es necesario definir una cuadrícula de valores. Para esta tarea debe evitar el uso de bucles para recorrer en iteración las combinaciones de puntos. En su lugar, si uno de los vectores es una columna y la otra es una fila, entonces MATLAB automáticamente construye la cuadrícula cuando los vectores se utilizan con un operador de matriz, como x+y o x-y. En este ejemplo, x es un vector 21-por-1 y y es un vector 1-por-16, por lo que la operación produce una matriz de 21 por 16 mediante la expansión de la segunda dimensión de x y la primera dimensión de y.

x = (-2:0.2:2)'; % 21-by-1 y = -1.5:0.2:1.5; % 1-by-16 F = x.*exp(-x.^2-y.^2); % 21-by-16

En los casos en los que desee crear explícitamente las cuadrículas, puede utilizar las funciones meshgrid y ndgrid.

Operaciones de matrices lógicas

Una extensión lógica del procesamiento masivo de matrices es vectorizar las comparaciones y la toma de decisiones. los operadores de comparación MATLAB aceptan entradas vectoriales y salidas vectoriales de retorno.

Por ejemplo, supongamos que mientras se recolectan datos de 10.000 conos, se registran varios valores negativos para el diámetro. Puede determinar qué valores de un vector son válidos con el operador >=:

D = [-0.2 1.0 1.5 3.0 -1.0 4.2 3.14]; D >= 0
ans =       0     1     1     1     0     1     1
puede explotar directamente la potencia de indexación lógica de MATLAB para seleccionar los volúmenes de cono válidos, Vgood, para los que los elementos correspondientes de D son no negativos:
Vgood = V(D >= 0);

MATLAB le permite realizar una lógica y o o sobre los elementos de un vector completo con las funciones all y any, respectivamente. Puede lanzar una advertencia si todos los valores de D están por debajo de cero:

if all(D < 0)    warning('All values of diameter are negative.')    return end

MATLAB también puede comparar dos vectores con tamaños compatibles, lo que le permite imponer restricciones adicionales. Este código encuentra todos los valores donde V es no negativo y D es mayor que H:

V((V >= 0) & (D > H))
el vector resultante es del mismo tamaño que las entradas.

Para ayudar a la comparación, MATLAB contiene valores especiales para denotar desbordamiento, subdesbordamiento y operadores indefinidos, como Inf y NaN. Los operadores lógicos isinf y isnan existen para ayudar a realizar pruebas lógicas para estos valores especiales. Por ejemplo, a menudo es útil excluir los valores de NaN de los cálculos:

x = [2 -1 0 3 NaN 2 NaN 11 4 Inf]; xvalid = x(~isnan(x))
xvalid =       2    -1     0     3     2    11     4   Inf

Nota

Inf == Inf devuelve true; sin embargo, NaN == NaN siempre devuelve false.

Operaciones matriciales

Al vectorizar código, a menudo es necesario construir una matriz con un tamaño o una estructura en particular. Existen técnicas para crear matrices uniformes. Por ejemplo, es posible que necesite una matriz de 5 por 5 de elementos iguales:

A = ones(5,5)*10;
o, es posible que necesite una matriz de valores de repetición:
v = 1:5; A = repmat(v,3,1)
A =       1     2     3     4     5      1     2     3     4     5      1     2     3     4     5

La función repmat posee flexibilidad en la creación de matrices de matrices o vectores más pequeños. repmat crea matrices repitiendo una matriz de entrada:

A = repmat(1:3,5,2) B = repmat([1 2; 3 4],2,2)
A =       1     2     3     1     2     3      1     2     3     1     2     3      1     2     3     1     2     3      1     2     3     1     2     3      1     2     3     1     2     3   B =       1     2     1     2      3     4     3     4      1     2     1     2      3     4     3     4

Operaciones de ordenación, configuración y conteo

En muchas aplicaciones, los cálculos realizados sobre un elemento de un vector dependen de otros elementos del mismo vector. Por ejemplo, un vector, x, podría representar un conjunto. Cómo iterar a través de un conjunto sin un bucle for o while no es obvio. El proceso se hace mucho más claro y la sintaxis menos engorroso cuando se utiliza el código vectorizado.

Eliminación de elementos redundantes

Existen varias formas diferentes de encontrar los elementos redundantes de un vector. Una manera implica la función diff. Después de ordenar los elementos vectoriales, los elementos adyacentes iguales producen una entrada cero cuando se utiliza la función diff en ese vector. Dado que diff(x) produce un vector que tiene un elemento menos que x, debe agregar un elemento que no sea igual a ningún otro elemento del conjunto. NaN siempre satisface esta condición. Por último, puede utilizar la indización lógica para elegir los elementos únicos en el conjunto:

x = [2 1 2 2 3 1 3 2 1 3]; x = sort(x); difference  = diff([x,NaN]); y = x(difference~=0)
y =       1     2     3
Alternativamente, podría realizar la misma operación utilizando la función unique:
y=unique(x);
sin embargo, la función unique podría proporcionar más funcionalidad de la necesaria y ralentizar la ejecución del código. Utilice las funciones tic y toc si desea medir el rendimiento de cada fragmento de código.

Contar elementos en un vector

En lugar de simplemente devolver el conjunto, o subconjunto, de x, puede contar las apariciones de un elemento en un vector. Después de las clases vectoriales, puede utilizar la función find para determinar los índices de cero valores en diff(x) y mostrar dónde cambian los elementos. La diferencia entre los índices posteriores de la función find indica el número de apariciones de un elemento determinado:

x = [2 1 2 2 3 1 3 2 1 3]; x = sort(x); difference  = diff([x,max(x)+1]); count = diff(find([1,difference])) y = x(find(difference))
count =       3     4     3   y =       1     2     3 
la función find no devuelve índices para los elementos NaN. Puede contar el número de valores NaN y Inf mediante las funciones isnan y isinf.

count_nans = sum(isnan(x(:))); count_infs = sum(isinf(x(:)));

Funciones comúnmente utilizadas en la vectorizacion

FunciónDescripción
all

Determinar si todos los elementos de la matriz son no nulos o verdaderos

any

Determinar si cualquier elemento de matriz es distinto de cero

cumsum

Suma acumulativa

diff

Diferencias y derivados aproximados

find

Buscar índices y valores de elementos no nulos

ind2sub

Suscripciones del índice lineal

ipermute

Dimensiones permute inversa del array N-D

logical

Convertir valores numéricos en lógicos

meshgrid

Cuadrícula rectangular en 2-d y espacio tridimensional

ndgrid

Cuadrícula rectangular en espacio N-D

permute

Reorganizar las dimensiones de la matriz N-D

prod

Producto de los elementos de la matriz

repmat

Repetir copias de array

reshape

Reformar matriz

shiftdim

Dimensiones de mayúsculas

sort

Ordenar elementos de matriz

squeeze

Quitar dimensiones singleton

sub2ind

Convertir subíndices a índices lineales

sum

Suma de elementos de matriz

Temas relacionados

Sitios web externos