-3

这是输入文件的样子:

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 CGGGAGGAG


#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 次(输入文件中列出的每个样本(这里样本表示总体,每个总体有 3 个个体)一个“表”)。因此,我想从这堆网格中提取,例如,第一个单元格(样本 1 中位置 1 的 A 数。然后我想将此数字与所有样本中位置 1 的 A 总数进行比较。对于我正在测试的模型,这个频率将是一个有意义的数字。

问题是,我不知道如何提取 dna 数组的一部分——一旦我弄清楚这个精简的例子,我将把它应用到非常大的输入文件中,并且一次要提取多个单元格。

4

1 回答 1

0

Af是一个 3 维数组:

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

但是,它只包含一个元素。它有一行、一列和一个“层”(或者您想命名第三维)。这让它有点毫无意义。你也可以这样:

float Af;

尽管如此,你没有那个 - 你有一个 3D 数组。现在让我们看看这一行:

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

所以首先它获取第(0, 0, 0)th 元素 from Af(正如我们刚刚看到的那样,它是唯一的元素,A并将第(i, j, j)th 元素添加dna到它。那一点很好,因为这两个元素都是 type float。即:

Af[0] = Af[0][0][0] + dna[i][j][k];
//      ^^^^^^^^^^^   ^^^^^^^^^^^^
//        These are both floats

所以这个加法的结果也是一个float。那么您尝试将此结果分配给什么?好吧,您尝试将其分配给,Af[0]但这不是float. 您已经简化了0在第一维中指定的第 th 索引。还有两个其他维度需要指定。的类型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然而,正如我所说,作为一个只有一个元素的 3 维数组是没有意义的。如果它只是 one float,请将其设为 a float,而不是数组。然后你会做上面的行:

Af += dna[i][j][k];
于 2013-03-04T20:32:42.217 回答