3D稀疏矩阵实现?

我已经找到了一个非常好的稀疏矩阵实现c#over
http://www.blackbeltcoder.com/Articles/algorithms/creating-a-sparse-matrix-in-net.

但是当我在3d坐标系中工作时,我需要一个稀疏矩阵实现,我可以使用它来映射三维坐标系.

细节:我将大量原始形状数据存储在内存中,就像立方体一样.我确实有大量的(大约3000万)我周围有很多空(零)条目.鉴于我的每个条目花费1个字节的条目,我想实现稀疏矩阵,以便我可以相当节省内存空间.

注意:快速访问矩阵单元对我来说是一个相当重要的因素,所以我的交易速度超过内存消耗.

最佳答案 我刚刚提出的一个非常简单的解决方案是:

public class Sparse3DMatrix<T>
{
    Dictionary<Tuple<int,int,int>, T> values = new Dictionary<Tuple<int, int, int>, T>();

    public T this[int x, int y, int z]
    {
        get { return values[new Tuple<int, int, int>(x, y, z)]; }
        set { values[new Tuple<int, int, int>(x, y, z)] = value; }
    }

    public bool ContainsKey(int x, int y, int z)
    {
        return values.ContainsKey(new Tuple<int, int, int>(x, y, z));
    }
}

用法:

var test = new Sparse3DMatrix<float>();
test[1, 1, 1] = 1f;
Console.WriteLine(test[1, 1, 1]);

可以使用他的版本所具有的方法进行扩展,并检查x,y,z值等.

我相信有人会对其表现有所说明.除非你真的需要高性能的东西,否则这将是一个不错的实现.这取决于Tuple的哈希码实现和您的具体用法.如果我们假设哈希值很好,我们将有O(1)查找时间.如果你知道你将拥有很多元素,你可以使用新的Dictionary< …>(初始容量)来避免在添加项目时不必要的大小调整.

与他不同,这只有一个包含所有项目的词典.他的版本有字典词典.他的好处是,如果你必须扫描整行,你可以只迭代二级字典(这不会帮助你想要扫描列),这比单独查找项目更快.但是使用单个字典意味着更少的内存使用量 – 特别是当您每行有少量项目时.

点赞