Sparse array multidimensionale o Matrix Biblioteche in .NET
-
21-08-2019 - |
Domanda
Ho una necessità di una matrice sparsa fino a 4 dimensioni in un'applicazione NET. La dimensione della matrice (se rappresentato come un array NET) potenzialmente non superiore 400MB.
L'array è probabile che sia molto scarsa, e ho bisogno di essere in grado di istanziare e smaltire molto rapidamente (anche se questo non è un no go). Sono quindi dopo una biblioteca sparse array, consumabile da NET 3.5 (che credo esclude utilizzando BGL da Managed C ++?), Che è il più denso possibile, come posso ottenere e supporti l'accesso indicizzazione veloce casuale. Deve essere serializzabile a qualche formato denso che può essere a buon mercato nella cache.
Una tal cosa esiste (ancora) per NET? FOSS? Coppia?
TIA
Andrew Matthews
Soluzione
dnAnalytics . Supporta matrici sparse, e ha molte opzioni tra cui risolutori robusto, il supporto per IMKL, ecc.
Altri suggerimenti
E 'abbastanza semplice da implementare il proprio con un dizionario. L'implementazione di seguito lavora per 2 dimensioni, ma si può facilmente implementare 3 o 4 dimensioni. Lo stoccaggio è molto efficace quando la matrice è scarsa. Non è una buona implementazione se si prevede di aggiungere o rimuovere frequentemente colonne.
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>();
}
come ti "implementare facilmente", dice una matrice tridimensionale 4 o tensore? Vedo solo i e j indici sopra ...