2009-07-03 10 views
5

Necesito una matriz dispersa en hasta 4 dimensiones en una aplicación .NET. El tamaño de la matriz (si se representa como una matriz .NET) podría superar los 400 MB.Matriz dispersa multidimensional o bibliotecas de matriz en .NET

Es probable que la matriz sea muy escasa, y necesito poder instanciarla y deshacerme de ella muy rápidamente (aunque eso no es un no ir). Por lo tanto, estoy buscando una biblioteca de matriz dispersa, consumibles de .NET 3.5 (que creo que descarta usar BGL de Managed C++?) Que es lo más denso posible y puedo soportar la indexación rápida de acceso aleatorio. Debe ser serializable a algún formato denso que se pueda almacenar en caché de forma económica.

¿Existe tal cosa (todavía) para .NET? ¿FOSS? ¿Maduro?

TIA

Andrew Matthews

Respuesta

2

Recomendaría dnAnalytics. Es compatible con matrices dispersas, y tiene muchas opciones, incluyendo solucionadores robustos, soporte para IMKL, etc.

+0

Gracias Reed, probé esta y quedé MUY impresionado. Ahora solo tengo que trabajar en mi álgebra lineal para aprovecharla al máximo. :PAG –

2

Es bastante simple de implementar su propio con un diccionario. La implementación a continuación funciona para 2 dimensiones pero puede implementar fácilmente 3 o 4 dimensiones. El almacenamiento es muy eficiente cuando la matriz es escasa. No es una buena implementación si planea agregar o eliminar columnas con frecuencia.

class SparseMatrix<T> 
    { 
     public T this[int i, int j] 
     { 
      get 
      { 
       T result; 
       if (!_data.TryGetValue(new Key(i, j), out result)) 
        return default(T); 
       return result; 
      } 
      set { _data[new Key(i, j)] = value; } // Could remove values if value == default(T) 
     } 

     private struct Key 
     { 
      public Key(int i, int j) 
      { 
       _i = i; 
       _j = j; 
      } 

      private readonly int _i;  
      private readonly int _j; 
      public override bool Equals(object obj) 
      { 
       if (!(obj is Key)) 
        return false; 
       var k = (Key) obj; 
       return k._i == _i && k._j == _j; 
      } 

      public override int GetHashCode() 
      { 
       return _i << 16 + _j; // Could be smarter based on the distribution of i and j 
      } 


     } 

     private readonly Dictionary<Key, T> _data = new Dictionary<Key, T>(); 
    } 
1

¿cómo lo "implementaría fácilmente", digamos una matriz de 4 dimensiones o un tensor? Solo veo los índices iyj arriba ...

Cuestiones relacionadas