Вот как выглядит входной файл:
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 во всех выборках. Эта частота будет значимым числом для модели, которую я тестирую.
Проблема в том, что я не знаю, как извлечь части массива ДНК — как только я выясню этот сжатый пример, я буду применять его к очень большим входным файлам и захочу извлекать более одной ячейки за раз.
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];
Других решений пока нет …