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

Mediante la vectorización

está optimizado para operaciones que implican matrices y vectores.MATLAB® Se llama al proceso de revisar el código basado en bucles y orientado a escalar para utilizar operaciones de matriz y vectores.MATLABvectorization La vectorización de su código vale la pena por varias razones:

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

  • :Less Error Prone Sin bucles, el código vectorizado suele ser más corto. Menos líneas de código significan menos oportunidades para introducir errores de programación.

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

Vectorización de código para la computación general

Este código calcula el seno de 1.001 valores que van desde 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);

El segundo ejemplo de código normalmente se ejecuta más rápido que el primero y es un uso más eficiente de.MATLAB Pruebe la velocidad de ejecución en el sistema mediante la creación de scripts que contengan el código mostrado y, a continuación, utilice las funciones y para medir el tiempo de ejecución.tictoc

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

Este código calcula la suma acumulada 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 

Mediante la vectorización, puede escribir un proceso mucho más conciso.MATLAB Este código muestra una forma de realizar la tarea:

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

Operaciones de matriz

Los operadores de matriz realizan la misma operación para todos los elementos del conjunto de datos. Estos tipos de operaciones son útiles para los cálculos repetitivos. Por ejemplo, supongamos que recoge el volumen () de varios Conos Registrando su diámetro () y altura ().VDH Si recopila 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 y cada uno contienen 10.000 elementos, y desea calcular 10.000 volúmenes.DH En la mayoría de los lenguajes de programación, debe 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, puede realizar el cálculo para cada elemento de un vector con una sintaxis similar a la del caso escalar:MATLAB

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

Nota

Colocar un punto () antes de que los operadores, y, y, los transforma en operadores de matriz..*/^

Los operadores de matriz también permiten combinar matrices de diferentes dimensiones. Esta expansión automática de dimensiones de tamaño 1 es útil para vectorizar la creación de cuadrículas, operaciones de matrices y vectores, y más.

Supongamos que la matriz representa las puntuaciones de las pruebas, las filas de las cuales denotan clases diferentes.A Desea calcular la diferencia entre la puntuación media y las puntuaciones individuales para cada clase. Con un bucle, la operación tiene el aspecto de:

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 forma más directa de hacerlo es con, lo que evita la necesidad de un loop y es significativamente más rápido.A - mean(A)

 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

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

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 dimensiones donde una de las matrices 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, consulte.Tamaños de matriz 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. Supongamos que desea evaluar una función, de dos variables y.Fxy

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

Para evaluar esta función en cada combinación de puntos de los y vectores, debe definir una cuadrícula de valores.xy Para esta tarea debe evitar el uso de bucles para iterar a través de las combinaciones de puntos. En su lugar, si uno de los vectores es una columna y el otro es una fila, entonces construye automáticamente la cuadrícula cuando los vectores se usan con un operador de matriz, como o.MATLABx+yx-y En este ejemplo, es un vector de 21 por 1 y es un vector de 1 por 16, por lo que la operación produce una matriz de 21 por 16 expandiendo la segunda dimensión de y la primera dimensión de.xyxy

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 y.meshgridndgrid

Operaciones de matriz lógica

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

Por ejemplo, supongamos que, al recopilar 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: puede explotar directamente el poder de indexación lógico para seleccionar los volúmenes de cono válidos, para los que los elementos correspondientes no son negativos:>=

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
MATLABVgoodD
Vgood = V(D >= 0);

le permite realizar un AND o OR lógico en los elementos de un vector completo con las funciones y, respectivamente.MATLABallany Puede lanzar una advertencia si todos los valores están por debajo de cero:D

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

también puede comparar dos vectores con tamaños compatibles, lo que le permite imponer restricciones adicionales.MATLAB Este código encuentra todos los valores donde V no es negativo y es mayor que: el vector resultante tiene el mismo tamaño que las entradas.DH

V((V >= 0) & (D > H))

Para facilitar la comparación, contiene valores especiales para denotar los operadores de desbordamiento, underflow y undefined, como y.MATLABInfNan Operadores lógicos y existen para ayudar a realizar pruebas lógicas para estos valores especiales.isinfisnan Por ejemplo, a menudo resulta útil excluir valores de los cálculos:Nan

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

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

Operaciones matriciales

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

A = ones(5,5)*10;
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 posee flexibilidad en la construcción de matrices a partir de matrices o vectores más pequeños. crea matrices repitiendo una matriz de entrada:repmatrepmat

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 recuento

En muchas aplicaciones, los cálculos realizados en un elemento de un vector dependen de otros elementos del mismo vector. Por ejemplo, un vector, puede representar un conjunto.x Cómo iterar a través de un conjunto sin un bucle o no es obvio.forwhile El proceso se vuelve 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 para encontrar los elementos redundantes de un vector. Una forma 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 en ese vector.diff Dado que produce un vector que tiene un elemento menos que, debe agregar un elemento que no sea igual a cualquier otro elemento del conjunto. siempre satisface esta condición.diff(x)xNan Por último, puede utilizar la indexación lógica para elegir los elementos únicos del conjunto:Como alternativa, puede realizar la misma operación mediante la función: sin embargo, la función podría proporcionar más funcionalidad de la necesaria y ralentizar la ejecución del código.

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
unique
y=unique(x);
unique Utilice las funciones y si desea medir el rendimiento de cada fragmento de código.tictoc

Contar elementos en un vector

En lugar de simplemente devolver el conjunto o subconjunto de, puede contar las apariciones de un elemento en un vector.x Después de que el vector ordena, puede utilizar la función para determinar los índices de valores cero en y para mostrar donde los elementos cambian de valor.finddiff(x) La diferencia entre los índices subsiguientes de la función indica el número de ocurrencias para un elemento en particular: la función no devuelve índices para los elementos.find

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 
findNan Puede contar el número y los valores mediante las funciones y.NanInfisnanisinf

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

Funciones utilizadas habitualmente en vectorización

FunciónDescripción
all

Determine si todos los elementos de matriz son distintos de cero o true

any

Determine si algún elemento de matriz es distinto de cero

cumsum

Suma acumulada

diff

Diferencias y derivados aproximados

find

Encuentre índices y valores de elementos distintos de cero

ind2sub

Subíndices del índice lineal

ipermute

Las cotas de permuto inversas de la matriz N-D

logical

Convierta valores numéricos a logicals

meshgrid

Rejilla rectangular en espacio en 2-D y 3-D

ndgrid

Rejilla rectangular en espacio N-D

permute

Reorganizar las dimensiones de la matriz N-D

prod

Producto de elementos de matriz

repmat

Repite copias de array

reshape

Reformar la matriz

shiftdim

Desplazar las cotas

sort

Ordenar elementos de matriz

squeeze

Quite las dimensiones singleton

sub2ind

Convierta índices lineales

sum

Suma de los elementos de matriz

Temas relacionados

Sitios web externos