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

War es hilfreich?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top