我需要在.NET应用程序中使用多达4维的稀疏矩阵。如果将其表示为.NET数组,矩阵的大小可能会超过400MB。
由于数组很可能非常稀疏,我需要能够快速地实例化和释放它(尽管这不是必须的)。因此,我需要一个稀疏数组库,可以从.NET 3.5中调用(我认为这排除了使用Managed C++中的BGL),该库尽可能密集,并支持快速的随机访问索引。它必须可序列化为一些便宜缓存的密集格式。
在.NET中是否存在这样的东西?是否开源?是否成熟?
谢谢您!
安德鲁·马修斯
我需要在.NET应用程序中使用多达4维的稀疏矩阵。如果将其表示为.NET数组,矩阵的大小可能会超过400MB。
由于数组很可能非常稀疏,我需要能够快速地实例化和释放它(尽管这不是必须的)。因此,我需要一个稀疏数组库,可以从.NET 3.5中调用(我认为这排除了使用Managed C++中的BGL),该库尽可能密集,并支持快速的随机访问索引。它必须可序列化为一些便宜缓存的密集格式。
在.NET中是否存在这样的东西?是否开源?是否成熟?
谢谢您!
安德鲁·马修斯
使用字典来实现矩阵操作非常简单。下面的实现适用于二维矩阵,但是你可以很容易地实现三维或四维矩阵。当矩阵稀疏时,存储非常高效。如果您计划经常添加或删除列,则不是一个好的实现方法。
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>();
}