2009-07-03 13 views
5

Ho bisogno di una matrice sparsa in un massimo di 4 dimensioni in un'applicazione .NET. La dimensione della matrice (se rappresentata come una matrice .NET) potrebbe potenzialmente superare i 400 MB.Array multidimensionale o Matrix sparse in .NET

Probabilmente la matrice è molto sparsa e devo essere in grado di istanziarla e disporla molto rapidamente (anche se questo non è un no go). Sono quindi in cerca di una libreria di array sparse, consumabile da .NET 3.5 (che credo escluda usando BGL da Managed C++?) Che è il più denso possibile che riesco ad ottenere e supporta l'indicizzazione rapida dell'accesso casuale. Deve essere serializzabile in un formato denso che può essere memorizzato in modo economico.

Esiste una cosa del genere (ancora) per .NET? FOSS? Maturo?

TIA

Andrew Matthews

risposta

2

Vorrei raccomandare dnAnalytics. Supporta matrici sparse e ha molte opzioni tra cui risolutori solidi, supporto per IMKL, ecc.

+0

Grazie Reed, ho dato a questo una prova ed è stato MOLTO colpito. Ora devo solo lavorare sulla mia algebra lineare per ottenere il massimo da esso. : P –

2

E 'abbastanza semplice da implementare il proprio con un dizionario. L'implementazione sotto funziona per 2 dimensioni ma puoi facilmente implementare 3 o 4 dimensioni. Lo storage è molto efficiente quando la matrice è scarsa. Non è una buona implementazione se si pianifica di aggiungere o rimuovere colonne frequentemente.

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

come si "implementa facilmente", ad esempio una matrice a 4 dimensioni o un tensore? Vedo solo indici i e j sopra ...