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];
}
}
}
}
答案 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存储bool
s in your std::vector
即内部向量与彼此或其他元素不相邻。
因此,如果要在结构中存储大量数据并且需要访问和迭代尽可能快,那么这种存储方法并不理想 - 它也会使遍历整个结构的问题复杂化。
当你需要快速迭代和随机访问时,一个很好的解决方案是存储一个大的多维“矩阵”(技术上在这种情况下我认为是4级张量)是在一个std::vector
周围写一个包装器一些row-major / column-major配置,使您的所有数据都存储为一个连续的块,您可以通过单个循环或调用std::for_each
(例如)来迭代它。然后,您访问该结构的每个索引将按顺序对应patch
,ind
,chrom
和gene
。
如果您不想自己编写包装器,那么可以处理此问题的预构建数据结构示例为boost::multi_array
。
答案 3 :(得分:1)
执行多维数组有两种主要方法。传染媒介传染媒介(亦称接合的数组)和真正多维数组 - n维立方体。使用后者意味着,例如,所有的染色体都具有相同量的基因,并且每个个体具有相同量的染色体。如果您可以接受这些限制,您将获得一些优势,如连续内存存储。