【问题标题】:Sparse Multidimensional Array or Matrix Libraries in .NET.NET 中的稀疏多维数组或矩阵库
【发布时间】:2010-11-07 19:37:28
【问题描述】:

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

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

.NET 是否存在(目前)这样的事情?开源软件?成熟?

TIA

安德鲁·马修斯

【问题讨论】:

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


    【解决方案1】:

    您将如何“轻松实现”,例如 4 维矩阵或张量?我只看到上面的 i 和 j 索引...

    【讨论】:

      【解决方案2】:

      我会推荐dnAnalytics。它支持稀疏矩阵,并且有许多选项,包括强大的求解器、对 IMKL 的支持等。

      【讨论】:

      • 感谢 Reed,我试了一下,印象非常深刻。现在我只需要研究我的线性代数来充分利用它。 :P
      【解决方案3】:

      用字典实现你自己的相当简单。下面的实现适用于 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>();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2023-04-05
        • 2011-10-07
        • 1970-01-01
        相关资源
        最近更新 更多