这是输入文件的样子:
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数组的部分 - 一旦我弄清楚这个简洁的例子,我将它应用于非常大的输入文件,并且想要提取多个单元格一段时间。
答案 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