C ++不兼容的类型:计算等位基因频率

时间:2013-02-26 22:49:55

标签: c++ arrays multidimensional-array genetic dna-sequence

这是输入文件的样子:

  

1-1_Sample 1   GCCCATGGCT   2-1_Sample 1   GAGTGTATGT   3-1_Sample 1   TGTTCTATCT   1-1_Sample 2   GCTTAGCCAT   2-1_Sample 2   TGTAGTCAGT   3-1_Sample 2   GGGAACCAAG   1-1_Sample 3   TGGAAGCGGT   2-1_Sample 3   CGGGAGGAGA   3-1_Sample 3   CTTCAGTTTT


#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>


using namespace std;

const int pops = 10;
const int sequence = 100;
string w;
string popname;
string lastpop;
int totalpops;
string ind;
int i;
int j;
char c;
float dna[pops][4][sequence];
float Af[1][1][1];

int main(int argc, char *argv[])
{
ifstream fin0("dnatest.txt");
lastpop = "nonsense";
totalpops = -1;

if (fin0)
{
do
{           
getline(fin0, w);
cout << w<<endl;
i=0;
ind = "";
     popname = "";

    do  {c = w [i];
         i++;
         if ((c != '>')&(c!='-'))  ind=ind+c; } while (c != '-');
     do {c = w [i];
         i++; } while (c != ' ');
     do {c = w [i];
         i++;
        if (c!= '\n') popname=popname+c; } while (i< w.length());
        if (popname != lastpop) { totalpops++;
        lastpop=popname;
        }

     getline (fin0, w);
     cout << w<<endl << w.length()<<endl;         
     for (i=0; i<w.length(); i++)
     {if (w[i]=='A') dna[totalpops][0][i]++;
      if (w[i]=='C') dna[totalpops][1][i]++;
      if (w[i]=='G') dna[totalpops][2][i]++;
      if (w[i]=='T') dna[totalpops][3][i]++;
      }

      for(int k=0;k<1;k++)
      {for(int j=0; j<1;j++)
        {for (int i=0;i<1;i++)
         Af[0] = Af[0][0][0]+dna[i][j][k]; //RETURNS THE ERROR "INCOMPATIBLE TYPES IN ASSIGNMENT OF 'FLOAT' TO 'FLOAT[1][1]'
         cout<<Af<<endl;}
    }

       while (!fin0.eof());

     }


system("PAUSE");
return EXIT_SUCCESS;
}

背景: 我是C ++的新手,并试图教我自己用它来补充我的研究生研究。我是遗传学博士候选人,试图模拟不同的进化历史,以及它们如何影响人群中等位基因的频率。

问题: 我试图从我从输入文件创建的“dna”数组中提取某些数据部分。 例如,在这里我创建了另一个数组“Af”,我试图提取第一个“单元格”的计数,可以这么说,dna数组。这样做的目的是通过比较某些单元组中的计数与整个dna数组来计算频率。我无法弄清楚如何做到这一点。我不断收到错误信息:“将'FLOAT'分配给'FLOAT [1] [1]'”不一致的类型

我花了很多时间在不同的论坛上研究这个问题,但我似乎无法理解这个错误意味着什么,以及如何实现我想要实现的目标。

因此,我可视化的dna数组是从输入文件制作的,因此有4行(A,C,G,T)。然后是10列(系列中每个核苷酸一列)。然后将该“网格”堆叠3次(每个样本一个“表”(此处样本表示人口,每个人口有三个人),如输入文件中所列)。 因此,我希望从这一堆网格中提取第一个单元格(位置1处样本1中的A的数量。然后,我希望将此数字与所有样本中位置1处的A的总数进行比较。对于我正在测试的模型,这个频率将是一个有意义的数字。

问题是,我不知道如何提取dna数组的部分 - 一旦我弄清楚这个简洁的例子,我将它应用于非常大的输入文件,并且想要提取多个单元格一段时间。

1 个答案:

答案 0 :(得分:0)

Af是一个三维数组:

float Af[1][1][1];

但是,它只包含一个元素。它有一行,一列和一个“图层”(或者您想要命名第三维)。这使得它有点无意义。你可能也有这个:

float Af;

尽管如此,你还没有 - 你有一个3D阵列。现在让我们来看看这一行:

Af[0] = Af[0][0][0] + dna[i][j][k];

首先,它需要来自(0, 0, 0)的{​​{1}}元素(我们刚才看到的是Af中唯一的元素,并添加了A元素(i, j, j)它。这一点很好,因为这两个元素都是dna类型。那就是:

float

因此,此添加的结果也是Af[0] = Af[0][0][0] + dna[i][j][k]; // ^^^^^^^^^^^ ^^^^^^^^^^^^ // These are both floats 。那你尝试将这个结果分配给什么?好吧,您尝试将其分配给float,但不是 Af[0]。您已在第一维中简化了float索引的指定。还有两个要指定的维度。 0的类型实际上是Af[0]float[1][1] s的二维数组)。这可行,例如:

float

这是你想做什么或不完全取决于我无法理解的问题。但是,正如我所说,将Af[0][0][0] = Af[0][0][0] + dna[i][j][k]; // Or equivalently: Af[0][0][0] += dna[i][j][k]; 作为一个只有一个元素的三维数组是没有意义的。如果它只是一个Af,请将其设为float,而不是数组。然后你会做以上行:

float