Pergunta

Eu tenho uma necessidade para uma matriz esparsa em até 4 dimensões em um aplicativo .NET. O tamanho da matriz (se representado como uma matriz .NET) 400 MB seria potencialmente superior.

A matriz é provável que seja muito escassa, e eu preciso ser capaz de instanciar e eliminá-lo muito rapidamente (embora isso não é um não ir). Estou, portanto, depois de uma biblioteca de matriz esparsa, consumível de .NET 3.5 (que eu acredito que exclui usando BGL do C ++ gerenciado?) Que é tão densa quanto possível, como posso obter e os suportes rápido aleatório indexação acesso. Deve ser serializado para algum formato denso que pode ser barata em cache.

Será que tal coisa existe (ainda) para .NET? FOSS? Madura?

TIA

Andrew Matthews

Foi útil?

Solução

Eu recomendaria dnAnalytics . Ele suporta matrizes esparsas, e tem muitas opções, incluindo solucionadores robustos, suporte para IMKL, etc.

Outras dicas

É bastante simples de implementar seu próprio com um dicionário. A implementação a seguir funciona para 2 dimensões, mas você pode facilmente implementar 3 ou 4 dimensões. O armazenamento é muito eficiente quando a matriz é escasso. Não é uma boa implementação, se você pretende adicionar ou remover colunas freqüentemente.

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

como você "facilmente implementar", disse uma matriz ou tensor dimensional 4? Eu só vejo i e j índices acima ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top