スパース多次元配列または.NETの行列ライブラリー
-
21-08-2019 - |
質問
Iは、.NETアプリケーションは最大4次元の疎行列を必要としています。マトリックスのサイズ(.NET配列として表されている場合)、潜在的に400メガバイトのトップであろう。
の配列は非常にまばらな可能性がある、と私は(それが全く行かないませんが)非常に迅速にそれをインスタンス化し、処分することができるようにする必要があります。私は私が取得し、サポート高速ランダムアクセスのインデックス作成することができますよう、できるだけ緻密で(私はマネージC ++からBGLを使用して除外?と考えていた)、.NET 3.5から疎な配列ライブラリー、消耗した後にそのためです。これは、安価にキャッシュすることができるいくつかの密な形式にシリアライズ可能でなければなりません。
このようなことは、.NETのために(まだ)存在していますか? FOSS?熟女?
TIA
アンドリュー・マシューズ
解決
私は dnAnalytics のをお勧めします。これは、スパース行列をサポートしており、などの堅牢なソルバー、IMKLのサポート、など、多くのオプションを持っています。
他のヒント
辞書を使用して独自の実装に非常に簡単です。以下の実装では、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>();
}
どのようにあなたが「簡単に実装する」だろう、4次元マトリックスまたはテンソルを言うの?私は...
上記のiとjのインデックスを参照してください所属していません StackOverflow