我应该使用简单的类还是高维矩阵?

时间:2016-10-09 20:46:51

标签: c++ performance class matrix vector

C ++新手在这里!我想模拟一个包含斑块的群体,其中包含含有染色体的个体,含有基因。

在C ++中使用一系列简单类与高维矩阵有什么优缺点?通常,访问内存插槽的时间是否在两种技术之间有所不同?

高维矩阵

可以制作“载体载体载体的载体”(或C型高维整数阵列)并使用

访问记忆中的任何基因
for (int patch=0;patch<POP.size();patch++)
{
    for (int ind=0;ind<POP[patch].size();patch++)
    {
        for (int chrom=0;chrom<POP[patch][ind].size();chrom++)
        {
            for (int gene=0;gene<POP[patch][ind][chrom].size();gene++)
            {
                 POP[patch][ind][chrom][gene];
            }
        }
    }   
}

系列简单课程

可以使用一系列简单的类并使用

访问内存中的任何基因
for (int patch=0;patch<POP->PATCHES.size();patch++)
{
    for (int ind=0;ind<POP->PATCHES[patch]->INDIVIDUALS.size();patch++)
    {
        for (int chrom=0;chrom<POP->PATCHES[patch]->INDIVIDUALS[ind]->CHROMOSOMES.size();chrom++)
        {
            for (int gene=0;gene<POP->PATCHES[patch]->INDIVIDUALS[ind]->CHROMOSOMES[chrom]->GENES.size();gene++)
            {
                POP->PATCHES[patch]->INDIVIDUALS[ind]->CHROMOSOMES[chrom]->GENES[gene];
            }
        }
    }   
}

4 个答案:

答案 0 :(得分:4)

虽然高维矩阵可行,但请考虑您可能希望向个人添加更多信息。它可能不仅有染色体,还有年龄,兄弟姐妹,父母,表型等等。有一个class Individual是很自然的,它可以包含所有信息及其染色体列表。使用类将相关信息组合在一起。

答案 1 :(得分:2)

虽然我总体上同意@ g-sliepen的回答,但还有一点你应该知道:

C ++使您能够区分界面和类型。您可以为代码的用户保留abstract类型(即使只有您自己),并为其提供一组有限的操作。

使用此模式可以让您完全更改实现(例如,返回到并行计算的向量等),而无需使用它来更改代码(例如具体的模拟)。

答案 2 :(得分:1)

我不会介绍已经建议的内容,因为将individual个实体存储为一个与其相关的所有相关字段的类通常是一个好主意,但我只会解决您的第一个建议:< / p>

使用类似std::vector<std::vector<std::vector<std::vector<type>>>>之类的问题(除了一般来说是一件痛苦的事情)是因为封闭结构的整体std::vector具有连续存储(只要你不是' t存储bools in your std::vector即内部向量与彼此或其他元素不相邻。

因此,如果要在结构中存储大量数据并且需要访问和迭代尽可能快,那么这种存储方法并不理想 - 它也会使遍历整个结构的问题复杂化。

当你需要快速迭代和随机访问时,一个很好的解决方案是存储一个大的多维“矩阵”(技术上在这种情况下我认为是4级张量)是在一个std::vector周围写一个包装器一些row-major / column-major配置,使您的所有数据都存储为一个连续的块,您可以通过单个循环或调用std::for_each(例如)来迭代它。然后,您访问该结构的每个索引将按顺序对应patchindchromgene

如果您不想自己编写包装器,那么可以处理此问题的预构建数据结构示例为boost::multi_array

答案 3 :(得分:1)

执行多维数组有两种主要方法。传染媒介传染媒介(亦称接合的数组)和真正多维数组 - n维立方体。使用后者意味着,例如,所有的染色体都具有相同量的基因,并且每个个体具有相同量的染色体。如果您可以接受这些限制,您将获得一些优势,如连续内存存储。