辞書を使用して独自の実装に非常に簡単です。以下の実装は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>();
}
ありがとうリード、私はこれを試してみて非常に感銘を受けました。今では、線形代数を最大限に活用するためには、線形代数に取り組まなければなりません。 :P –