Sparse mehrdimensionales Array oder Matrix Bibliotheken in .NET
-
21-08-2019 - |
Frage
Ich habe einen Bedarf an einer Sparse Matrix in bis zu 4 Dimensionen in einer .NET-Anwendung. Die Größe der Matrix (wenn als .NET-Array dargestellt) würde möglicherweise oben 400MB.
Das Array ist wahrscheinlich sehr schwach sein, und ich muß in der Lage sein, es zu instanziieren und entsorgen sehr schnell (aber das ist nicht ein no go). Ich bin deshalb nach einer spärlichen Array-Bibliothek, Verbrauch von .NET 3.5 (was ich glaube BGL anhand von Regeln aus Managed C ++?), Die so dicht wie möglich ist, wie ich bekommen kann und die Träger schnell Random Access Indizierung. Es muss serialisierbar einige dichte Format, das kostengünstig zwischengespeichert werden können.
Gibt es so etwas gibt (noch) für .NET? FOSS? Ältere?
TIA
Andrew Matthews
Lösung
Ich würde empfehlen, dnAnalytics . Es unterstützt dünn besetzte Matrizen und viele Optionen, einschließlich robuste Löser hat, Unterstützung für IMKL, etc.
Andere Tipps
Es ist ziemlich einfach Ihre eigenen mit einem Wörterbuch zu implementieren. Die Umsetzung unten arbeitet für zwei Dimensionen, aber Sie können 3 oder 4 Dimensionen leicht implementieren. Die Lagerung ist sehr effizient, wenn die Matrix spärlich ist. Es ist keine gute Umsetzung, wenn Sie Spalten planen häufig hinzuzufügen oder zu entfernen.
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>();
}
Wie würden Sie „leicht implementieren“, sagt eine 4 dimensionale Matrix oder Tensor? Ich sehe nur i und j Indizes oben ...