代码之家  ›  专栏  ›  技术社区  ›  Andrew Matthews

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

  •  5
  • Andrew Matthews  · 技术社区  · 15 年前

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

    数组可能非常稀疏,我需要能够非常快速地实例化和处理它(尽管这不是一个不可能的事情)。因此,我在稀疏数组库中,从.NET 3.5(我相信使用BCL从管理C++中排除规则)的消耗品尽可能密集,支持快速随机访问索引。它必须可序列化为某种密集格式,可以廉价缓存。

    对于.NET来说,这样的东西(现在)还存在吗?福斯?成熟

    安德鲁·马修斯

    3 回复  |  直到 11 年前
        1
  •  3
  •   pn.    15 年前

    使用字典实现自己的功能相当简单。下面的实现适用于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>();
        }
    
        2
  •  2
  •   Reed Copsey    15 年前

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

        3
  •  1
  •   Wendels    14 年前

    比如说四维矩阵或张量,你如何“轻松实现”?我只看到上面的I和j指数。。。