Pregunta

Tengo una necesidad de una matriz dispersa en un máximo de 4 dimensiones en una aplicación .NET. El tamaño de la matriz (si representa como una matriz de .NET) potencialmente superior 400 MB.

Es probable que sea muy escasa la matriz, y tengo que ser capaz de crear una instancia y disponer muy rápidamente (aunque eso no es un no ir). Estoy por lo tanto, después de una biblioteca escasa matriz, consumibles de .NET 3.5 (que creo que descarta el uso de BGL de C ++?) Que es tan densa como sea posible como puedo conseguir y los soportes de indexación rápido acceso aleatorio. Debe ser serializable a algún formato densa que se pueden almacenar en caché económica.

¿Existe tal cosa (aún) para .NET? FOSS? Madura?

TIA

Andrew Matthews

¿Fue útil?

Solución

Yo recomendaría dnAnalytics . Es compatible con matrices dispersas, y tiene muchas opciones, incluyendo solucionadores robustos, el apoyo a IMKL, etc.

Otros consejos

Es bastante simple de implementar su propio con un diccionario. La aplicación funciona para a continuación 2 dimensiones, pero se puede implementar fácilmente 3 o 4 dimensiones. El almacenamiento es muy eficiente cuando la matriz es escasa. No es una buena aplicación si va a añadir o eliminar columnas con frecuencia.

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

¿cómo "implementar fácilmente", por ejemplo una matriz o tensor de 4 dimensiones? Sólo veo yo y los índices j arriba ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top