2009-07-03 5 views
5

.NETアプリケーションでは、4次元までの疎行列が必要です。行列のサイズ(.NET配列として表現されている場合)は、潜在的に400MBを上回ります。.NETのスパース多次元配列またはマトリックスライブラリ

配列は非常に疎である可能性が高く、非常に素早くインスタンス化して処理する必要があります(ただし、これは問題ありません)。したがって、私は得ることができ、高速ランダムアクセスインデックス作成をサポートしているので、.NET 3.5(Managed C++からBGLを使用してルールを外すことはできないと考えています)から消耗している疎配列ライブラリの後です。それは、安価にキャッシュできる密なフォーマットに直列化可能でなければならない。

.NET用にこのようなことはありますか? FOSS?成熟した?

TIA

アンドリュー・マシューズ

答えて

2

私はdnAnalyticsをお勧めします。これは、疎な行列をサポートし、強力なソルバー、IMKLのサポートなど多くのオプションがあります。

+0

ありがとうリード、私はこれを試してみて非常に感銘を受けました。今では、線形代数を最大限に活用するためには、線形代数に取り組まなければなりません。 :P –

2

辞書を使用して独自の実装に非常に簡単です。以下の実装は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

どのように "簡単に実装する"、4次元の行列やテンソルは?私は上記のiとjの指標のみを参照してください...