首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用简单的类还是高维矩阵?

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

Stack Overflow用户
提问于 2016-10-09 20:46:50
回答 4查看 70关注 0票数 3

C++新手来了!我想模拟一个群体,包括斑块,个体,染色体,基因。

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

高维矩阵

您可以制作“向量向量的向量”(或C型高维整数数组),并在内存中访问任何基因。

代码语言:javascript
复制
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];
            }
        }
    }   
}

级数的简单类

我们可以使用一系列简单的类来访问内存中的任何基因

代码语言:javascript
复制
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];
            }
        }
    }   
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-09 21:06:50

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

票数 4
EN

Stack Overflow用户

发布于 2016-10-09 21:40:03

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

C++使您能够区分接口和类型。您可以为代码的用户保留摘要类型(即使只有您),并在其上提供有限的操作集。

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

票数 2
EN

Stack Overflow用户

发布于 2016-10-09 21:43:35

我将不讨论已经提出的内容,因为通常将individual实体存储为一个具有与其相关的所有相关字段的类是一个好主意,但我将只讨论您的第一个建议:

使用像std::vector<std::vector<std::vector<std::vector<type>>>>这样的东西(除了一般地处理它很痛苦)的问题是,虽然包含结构的整体std::vector具有连续的存储(只要您不存储std::vector,也就是说),内部向量并不是彼此相邻的或其他元素。

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

当您需要快速迭代和随机访问时,存储大型多维“矩阵”(在本例中是4级张量)的一个很好的解决方案是在某些std::vector配置中为单个行-专业/列-专业编写一个包装器,以便将所有数据存储为一个连续块,并且可以通过单个循环或对std::for_each的调用来遍历所有数据(例如)。然后,您访问结构的每个索引将依次对应于patchindchromgene

一个可以处理这个问题的预先构建的数据结构的例子是boost::multi_array,如果您不自己编写包装器的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39948364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档