Question

J'ai besoin d'une matrice creuse dans un maximum de 4 dimensions dans une application .NET. La taille de la matrice (le cas représenté sous la forme d'une matrice de .NET) serait potentiellement supérieure 400MB.

Le tableau est susceptible d'être très rares, et je dois pouvoir instancier et de disposer très rapidement (bien que ce soit pas un no go). Je suis donc après une bibliothèque de tableau clairsemé, consommable de .NET 3.5 (que je crois que les règles à l'aide de BGL Managed C ++?) Qui est aussi dense que possible que je peux obtenir et les supports d'indexation d'un accès rapide au hasard. Il doit être sérialisable à un format dense qui peut être mis en mémoire cache à peu de frais.

Est-ce qu'une telle chose existe (encore) pour .NET? Les logiciels libres? Mature?

TIA

Matthews Andrew

Était-ce utile?

La solution

Je recommande dnAnalytics . Il prend en charge les matrices creuses, et a de nombreuses options, y compris solveurs robustes, soutien IMKL, etc.

Autres conseils

Il est assez simple à mettre en œuvre votre propre avec un dictionnaire. La mise en œuvre fonctionne ci-dessous pour 2 dimensions mais vous pouvez facilement mettre en œuvre 3 ou 4 dimensions. Le stockage est très efficace lorsque la matrice est clairsemée. Il est pas une bonne mise en œuvre si vous prévoyez d'ajouter ou supprimer des colonnes fréquemment.

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>();
    }

comment voulez-vous « mettre en œuvre facilement », par exemple une matrice 4 dimensions ou tenseur? Je ne vois que i et indices j ci-dessus ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top