Разреженные многомерные массивы или библиотеки матриц в .NET

StackOverflow https://stackoverflow.com/questions/1077302

Вопрос

Мне нужна разреженная матрица размером до 4 измерений в приложении .NET.Размер матрицы (если она представлена ​​в виде массива .NET) потенциально может превысить 400 МБ.

Массив, скорее всего, будет очень разреженным, и мне нужно иметь возможность очень быстро создавать и удалять его (хотя это не бесполезно).Поэтому мне нужна библиотека разреженных массивов, потребляемая из .NET 3.5 (что, как я полагаю, исключает использование BGL из Managed C++?), которая является настолько плотной, насколько это возможно, и поддерживает быструю индексацию произвольного доступа.Он должен быть сериализуемым в какой-то плотный формат, который можно недорого кэшировать.

Существует ли такая вещь (пока) для .NET?ФОСС?Зрелый?

ТИА

Эндрю Мэтьюз

Это было полезно?

Решение

Я бы посоветовал днАналитика.Он поддерживает разреженные матрицы и имеет множество опций, включая надежные решатели, поддержку IMKL и т. д.

Другие советы

Довольно просто реализовать свой собственный с помощью словаря.Приведенная ниже реализация работает для двух измерений, но вы можете легко реализовать 3 или 4 измерения.Хранение очень эффективно, когда матрица разрежена.Это не лучшая реализация, если вы планируете часто добавлять или удалять столбцы.

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

как бы вы «легко реализовали», скажем, четырехмерную матрицу или тензор?Я вижу только индексы i и j выше...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top