.NET中的稀疏多维数组或矩阵库

时间:2009-07-03 00:04:25

标签: .net graph .net-3.5 sparse-matrix directed-graph

我需要.NET应用程序中最多4维的稀疏矩阵。矩阵的大小(如果表示为.NET数组)可能会超过400MB。

数组可能非常稀疏,我需要能够非常快速地实例化和处理它(尽管这不是不行)。因此,我在一个稀疏的数组库之后,从.NET 3.5(我相信使用来自托管C ++的BGL排除?)这个稀疏数组库尽可能地密集,并且支持快速随机访问索引。它必须可序列化为一些可以低成本缓存的密集格式。

.NET存在这样的事情吗? FOSS?成熟?

TIA

Andrew Matthews

3 个答案:

答案 0 :(得分:2)

使用Dictionary实现自己的相当简单。下面的实现适用于2维,但您可以轻松实现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>();
    }

答案 1 :(得分:2)

我会推荐dnAnalytics。它支持稀疏矩阵,并有许多选项,包括鲁棒求解器,支持IMKL等。

答案 2 :(得分:1)

你会如何“轻松实现”,比如4维矩阵或张量?我只看到上面的i和j指数...