6

.NET アプリケーションで最大 4 次元の疎行列が必要です。マトリックスのサイズ (.NET 配列として表される場合) は、400MB を超える可能性があります。

配列は非常にまばらである可能性が高く、インスタンス化して非常に迅速に破棄できるようにする必要があります (ただし、それは不可能ではありません)。したがって、私は.NET 3.5から消費可能なスパース配列ライブラリを求めています(Managed C ++からBGLを使用することは除外されていると思いますか?)。低コストでキャッシュできる密度の高い形式にシリアライズ可能である必要があります。

そのようなものは (まだ) .NET に存在しますか? フォス? 成熟した?

ティア

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

4

3 に答える 3

3

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>();
    }
于 2009-07-03T00:21:47.350 に答える
2

dnAnalyticsをお勧めします。スパース行列をサポートし、堅牢なソルバー、IMKL のサポートなど、多くのオプションがあります。

于 2009-07-03T00:42:00.337 に答える
1

4次元の行列やテンソルなど、どのように「簡単に実装」しますか?上記のiとjのインデックスのみが表示されます...

于 2010-06-18T19:35:21.203 に答える