массивы — C ++ несовместимые типы: вычисление частот аллелей

Вот как выглядит входной файл:

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 ++ и пытаюсь научить себя использовать его для дополнения своих исследований в аспирантуре. Я кандидат наук в области генетики, пытаюсь смоделировать различные эволюционные истории и то, как они влияют на частоту аллелей в разных популяциях.

Вопрос:
Я пытаюсь извлечь определенные части данных из массива «ДНК», который я создал из входного файла.
Например, здесь я создал другой массив «Af», в котором я пытаюсь извлечь значения для первой, так сказать, «ячейки» массива dna. Цель этого состоит в том, чтобы я мог вычислить частоту, сравнивая значения в определенных группах ячеек со всем массивом ДНК. Я не могу понять, как это сделать. Я продолжаю получать сообщение об ошибке: «НЕСОВМЕСТИМЫЕ ТИПЫ В НАЗНАЧЕНИИ« ПЛАВАНИЯ »НА« ПЛАВУ [1] [1] ‘»

Я потратил много времени на изучение этого на разных форумах, но я не могу понять, что означает эта ошибка, и как еще добиться того, чего я пытаюсь достичь.

Таким образом, массив ДНК, который я визуализирую, сделан из входного файла, так что есть 4 строки (A, C, G, T). а затем 10 столбцов (один столбец для каждого нуклеотида в серии). Эта «сетка» затем складывается 3 раза (по одному «листу» для каждой выборки (здесь выборка означает популяцию, а на популяцию приходится три человека), как указано во входном файле).
Таким образом, из этого стека сеток я хочу извлечь, например, первую ячейку (количество A в образце 1 в позиции 1. Затем я бы хотел сравнить это число с общим количеством A в положении 1 во всех выборках. Эта частота будет значимым числом для модели, которую я тестирую.

Проблема в том, что я не знаю, как извлечь части массива ДНК — как только я выясню этот сжатый пример, я буду применять его к очень большим входным файлам и захочу извлекать более одной ячейки за раз.

-3

Решение

Af 3-мерный массив:

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

Тем не менее, он содержит только один элемент. Он имеет одну строку, один столбец и один «слой» (или, как вы хотите, назвать третье измерение). Это делает его немного бессмысленным. Вы могли бы просто иметь это:

float Af;

Тем не менее, у вас нет этого — у вас есть 3D-массив. Теперь давайте посмотрим на эту строку:

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

Итак, сначала требуется (0, 0, 0)й элемент из 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] (двумерный массив 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, а не массив. Тогда вы бы сделали вышеуказанную строку как:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]