= Virtual Matrix = El tipo VMatrix, presentado en la versión 1.1.7, encapsula el tratamiento de matrices especiales que no pueden tratarse de forma eficiente con el tipo Matrix, permitiendo formatos internos polimórficos especializados para distintos tipos de estructuras matriciales. Es decir, en realidad engloba varios subtipos que se clasificarán en virtud de los siguientes conceptos: * Engine: Cada motor de cálculo requiere sus propios tipos de datos ad-hoc para sacar el máximo partido de sus algoritmos. Se tratará de incluir los principales sistemas de álgebra matricial para tratar los problemas más usuales de matrices densas, sparse, estructuradas (Toeplitz, Vandermonde, ...) e incluso para poder definir matrices como operadores lineales genéricos. Los motores para los que existe interfaz de matriz virtual son actualmente: * BLAS&LAPACK * CHOLMOD * Cell: Por el momento sólo se implementará el tipo de celda Real con doble precisión (64 bits) pero se estudiará la posibilidad de ampliar a precisión simple (32 bits) y alta precisión (80 bits) en los paquetes en que estén disponibles. * Real: single, double, high * Complex: single, double, high * Store: Cada motor de cálculo puede ofrecer distintas formas de almacenar los datos que definen una matriz en función de su estructura interna y del tipo de algoritmos que se ejecutarán sobre la misma. Las operaciones realizables con matrices virtuales dependen de cada subtipo lo cual complica algo su uso, pero como contrapartida se tiene acceso a métodos altamente especializados y eficaces. == BLAS&LAPACK == El motor de cálculo BLAS&LAPACK supone el paquete más consolidado de álgebra lineal y muchas de las operaciones del tipo Matrix ya lo usan, pero algunas características importantes no son accesibles por ese camino. Para ello se implementan subtipos especiales de VMatrix sobre los que se implementarán las funciones primitivas de BLAS&LAPACK con un interfaz lo más parecido al original que sea posible. Para sacar el máximo partido se debe contar con una implementación de BLAS optimizada para la máquina en que se vaya a usar. * Column Major Dense: Es el tipo de datos básico de BLAS&LAPACK en el formato nativo de fortran en el que las celdas de cada columna son consecutivas, en contraposición al tipo Row Major considerado como nativo en C/C++ y usado en el tipo Matrix. * Triangular Compact: (Aún sin implemmentar) Se utiliza en algunos tratamiento de matrices triangulares y simétricas en las que sólo se tienen en cuenta la diagonal y las celdas por debajo de la misma, o bien las celdas por encima, ahorrando casi la mitad del espacio de memoria y de operaciones. * Banded Compact: (Aún sin implemmentar) En las matrices de bandas, de forma similar a las triangulares, sólo se tienen en cuenta las celdas de un rango de subdiagonales alrededor de la diagonal principal. Cuando el número de estas es reducido existen algoritmos muy eficientes que conjugan la especial estructura sparse con la eficacia de BLAS en el uso de la CPU. == CHOLMOD == Estos son los subtipos de matrices virtuales especializados para el motor de cálculo CHOLMOD para la resolución de sistemas lineales reales sparse y otros temas relacionados con la descomposición de Choleski a gran escala. * Sparse: Es el tipo fundamental de matrices sparse de CHOLMOD y ofrece una amplia gama de operaciones implementadas de forma muy eficiente. * Factor: Es una especialización del anterior subtipo Sparse utilizada para almacenar la factorización de Choleski de una matriz Sparse de una forma especialemente eficaz para resolver los sistemas lineales asociados a dicha descomposición. Para realizar otras operaciones distintas de las específicas de este tipo se precisa transformarla primero al subtipo Sparse. * Dense: Coincide conceptual y físicamente con el Column Major Dense de BLAS y son completamente intercambiables pues se tratan internamente como uno sólo. * Triplet: Se ofrece tan sólo a efectos de almacenamiento externo e interfaz con otros sistemas. Se trata simplemente de ternas (i,j,x(i,j)) que vinculan el valor de cada celda al número de fila y columna al que corresponde, lo cual conjuga un ahorro importante de memoria con matrices suficientemente sparse con una gran facilidad de manejo, dado que la estructura interna de los subtipos Sparse y Factor es demasiado complicada para su manejo directo. No exiten operadores matriciales propiamente dichos para el trato directo de estos objetos, salvo los de conversión a otros formatos y los de extracción y ensamblaje de bloques.