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.

Evaluación diferida de matrices altas

Una de las diferencias entre las matrices altas y los arreglos de MATLAB® en memoria es que los arreglos de discos altos normalmente permanecen evaluados hasta que se solicita que se realicen los cálculos. (las excepciones a esta regla incluyen funciones de trazado como plot y histogram y algunas funciones de ajuste estadístico como fitlm, que evalúan automáticamente las entradas de arreglo de discos altos.) Mientras que una matriz alta está en un estado no evaluado, MATLAB puede que no conozca su tamaño, su tipo de datos o los valores específicos que contiene. Sin embargo, todavía puede utilizar matrices no evaluadas en sus cálculos como si se conocieran los valores. Esto le permite trabajar rápidamente con grandes conjuntos de datos en lugar de esperar a que cada comando se ejecute. Por esta razón, se recomienda que utilice gather sólo cuando necesite salida.

MATLAB hace un seguimiento de todas las operaciones que realiza en arreglos de discos altos no evaluados a medida que los ingresa. Cuando finalmente se llama a gather para evaluar las operaciones en cola, MATLAB utiliza el historial de comandos no evaluados para optimizar el cálculo minimizando el número de pasadas a través de los datos. Utilizado correctamente, esta optimización puede ahorrar grandes cantidades de tiempo de ejecución eliminando pasadas innecesarias a través de grandes conjuntos de datos.

Visualización de matrices altas no evaluadas

La visualización de matrices altas no evaluadas varía en función de la cantidad de MATLAB que conozca sobre el array y sus valores. Hay tres piezas de información reflejadas en la pantalla:

  • Tamaño de la matriz : Los tamaños de cotas desconocidos están representados por las variables M o N en la pantalla. Si no se conocen tamaños de cotas, el tamaño aparece como MxNx.....

  • Tipo de datos de matriz : Si la matriz tiene un tipo de datos subyacente desconocido, su tipo aparecerá como tall array. Si se conoce el tipo, aparece como, por ejemplo, tall double array.

  • Valores de matriz : Si los valores de la matriz son desconocidos, aparecen como ?. Se muestran los valores conocidos.

MATLAB podría saber todos, algunos, o ninguno de estos pedazos de información sobre una matriz alta dada, dependiendo de la naturaleza del cálculo.

Por ejemplo, si la matriz tiene un tipo de datos conocido pero un tamaño y valores desconocidos, la matriz alta no evaluada podría verse así:

M×N×... tall double array      ?    ?    ?    ...     ?    ?    ?    ...     ?    ?    ?    ...     :    :    :     :    :    :

Si el tipo y el tamaño relativo se conocen, entonces la exhibición podría ser:

 1×N tall char array      ?    ?    ?   ... 

Si se conocen algunos de los datos, MATLAB muestra los valores conocidos:

  100×3 tall double matrix      0.8147    0.1622    0.6443     0.9058    0.7943    0.3786     0.1270    0.3112    0.8116     0.9134    0.5285    0.5328     0.6324    0.1656    0.3507     0.0975    0.6020    0.9390     0.2785    0.2630    0.8759     0.5469    0.6541    0.5502       :         :         :       :         :         :

Evaluación con gather

La función gather se utiliza para evaluar matrices altas. gather acepta matrices altas como entradas y devuelve matrices en memoria como salidas. Por esta razón, puede pensar en esta función como un puente entre matrices altas y matrices en memoria. Por ejemplo, no puede controlar las instrucciones de bucle if o while mediante una matriz alta, pero una vez que la matriz se evalúa con gather se convierte en un valor lógico en memoria que puede utilizar en estos contextos.

gather realiza todas las operaciones en cola en una matriz alta y devuelve el resultado toda en la memoria. Dado que gather devuelve resultados como matrices de MATLAB en memoria, se aplican consideraciones de memoria estándar. MATLAB podría agotar la memoria si el resultado devuelto por gather es demasiado grande.

La mayoría de las veces se puede utilizar gather para ver el resultado completo de un cálculo, particularmente si el cálculo incluye una operación de reducción como sum o mean. Sin embargo, si el resultado es demasiado grande para caber en la memoria, entonces puede utilizar gather(head(X)) o gather(tail(X)) para realizar el cálculo y mirar sólo las primeras o últimas filas del resultado.

Resolver errores con gather

Si introduce un comando erróneo y gather no evalúa una variable de matriz alta, debe eliminar la variable del espacio de trabajo y volver a crear la matriz alta mediante comandos válidos de sólo . Esto se debe a que MATLAB realiza un seguimiento de todas las operaciones realizadas en arreglos de discos altos no evaluados al introducirlos. La única manera de hacer MATLAB "olvidar" acerca de una declaración errónea es reconstruir la matriz alta desde cero.

Ejemplo: calcular el tamaño de la matriz alta

En este ejemplo se muestra la apariencia de una matriz alta no evaluada y cómo evaluar la matriz.

Cree un almacén de datos para el conjunto de airlinesmall.csv. Convierta el almacén de almacenamiento en una tabla alta y, a continuación, calcule el tamaño.

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'}; ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ... 'SelectedVariableNames', varnames); tt = tall(ds)
tt =    M×4 tall table      ArrDelay    DepDelay    Origin    Dest      ________    ________    ______    _____          8          12       'LAX'     'SJC'         8           1       'SJC'     'BUR'        21          20       'SAN'     'SMF'        13          12       'BUR'     'SJC'         4          -1       'SMF'     'LAX'        59          63       'LAX'     'SJC'         3          -2       'SAN'     'SFO'        11          -1       'SEA'     'LAX'        :           :          :         :        :           :          :         :
s = size(tt)
s =    1×2 tall double row vector      ?    ? 

El cálculo del tamaño de una matriz alta devuelve una respuesta pequeña (un vector 1 por 2), pero la pantalla indica que todavía se requiere un pase completo a través de los datos para calcular el tamaño de tt.

Utilice la función gather para evaluar completamente la matriz alta y llevar los resultados a la memoria. A medida que se ejecuta el comando, hay una pantalla de progreso dinámico en la ventana de comandos que es particularmente útil con cálculos largos.

Nota

Siempre asegúrese de que el resultado devuelto por gather será capaz de caber en la memoria. Si utiliza gather directamente en una matriz alta sin reducir su tamaño utilizando una función como mean, entonces MATLAB podría agotar la memoria.

tableSize = gather(s)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0 sec Evaluation completed in 0 sec  tableSize =        123523           4

Ejemplo: cálculos Multipass con matrices altas

En este ejemplo se muestra cómo se pueden combinar varios cálculos para minimizar el número total de pasadas a través de los datos.

Cree un almacén de datos para el conjunto de airlinesmall.csv. Convertir el almacén de almacenamiento en una tabla alta.

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'}; ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ... 'SelectedVariableNames', varnames); tt = tall(ds)
tt =    M×4 tall table      ArrDelay    DepDelay    Origin    Dest      ________    ________    ______    _____          8          12       'LAX'     'SJC'         8           1       'SJC'     'BUR'        21          20       'SAN'     'SMF'        13          12       'BUR'     'SJC'         4          -1       'SMF'     'LAX'        59          63       'LAX'     'SJC'         3          -2       'SAN'     'SFO'        11          -1       'SEA'     'LAX'        :           :          :         :        :           :          :         :

Reste el valor medio de DepDelay de ArrDelay para crear una nueva variable AdjArrDelay. A continuación, calcule el valor medio de AdjArrDelay y reste este valor medio de AdjArrDelay. Si todos estos cálculos fueran evaluados por separado, entonces MATLAB requeriría cuatro pases a través de los datos.

AdjArrDelay = tt.ArrDelay - mean(tt.DepDelay,'omitnan'); AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,'omitnan')
AdjArrDelay =    M×N×... tall array      ?    ?    ?    ...     ?    ?    ?    ...     ?    ?    ?    ...     :    :    :     :    :    : 

Evalúe AdjArrDelay y vea las primeras filas. Debido a que algunos cálculos se pueden combinar, sólo se requieren tres pasadas a través de los datos.

gather(head(AdjArrDelay))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 3: Completed in 0 sec - Pass 2 of 3: Completed in 0 sec - Pass 3 of 3: Completed in 0 sec Evaluation completed in 2 sec  ans =      0.8799     0.8799    13.8799     5.8799    -3.1201    51.8799    -4.1201     3.8799

Resumen de comportamiento y recomendaciones

  1. Las matrices altas permanecen sin evaluar hasta que se solicita la salida mediante gather.

  2. Utilice gather en la mayoría de los casos para evaluar los cálculos de arreglo alto. Si cree que el resultado de los cálculos puede no encajar en la memoria, utilice gather(head(X)) o gather(tail(X)) en su lugar.

  3. Trabaje principalmente con arreglos de discos altos no evaluados y solicite la salida sólo cuando sea necesario. Cuanto más cálculos en cola hay que no están evaluados, más optimización MATLAB puede hacer para minimizar el número de pasadas a través de los datos.

  4. Si introduce un comando de array alto erróneo y gather no puede evaluar una variable de matriz alta, entonces debe eliminar la variable del espacio de trabajo y volver a crear la matriz alta usando comandos válidos de sólo .

Consulte también

|

Temas relacionados