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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top