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

6

我需要在.NET应用程序中使用多达4维的稀疏矩阵。如果将其表示为.NET数组,矩阵的大小可能会超过400MB。

由于数组很可能非常稀疏,我需要能够快速地实例化和释放它(尽管这不是必须的)。因此,我需要一个稀疏数组库,可以从.NET 3.5中调用(我认为这排除了使用Managed C++中的BGL),该库尽可能密集,并支持快速的随机访问索引。它必须可序列化为一些便宜缓存的密集格式。

在.NET中是否存在这样的东西?是否开源?是否成熟?

谢谢您!

安德鲁·马修斯

3个回答

3

使用字典来实现矩阵操作非常简单。下面的实现适用于二维矩阵,但是你可以很容易地实现三维或四维矩阵。当矩阵稀疏时,存储非常高效。如果您计划经常添加或删除列,则不是一个好的实现方法。

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

2
我建议使用dnAnalytics。它支持稀疏矩阵,并有许多选项,包括强大的求解器,对IMKL的支持等。

谢谢Reed,我试了一下这个,非常印象深刻。现在我只需要努力学习线性代数,以便更好地利用它。 :P - Andrew Matthews

1
你如何“轻松实现”一个4维矩阵或张量?我只看到上面的i和j索引...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接