-3

入力ファイルは次のようになります。

1-1_サンプル1 GCCCATGGCT 2-1_サンプル1 GAGTGTATGT 3-1_サンプル1 TGTTCTATCT 1-1_サンプル2 GCTTAGCCAT 2-1_サンプル2 TGTAGTCAGT 3-1_サンプル2 GGGAACCAAG 1-1_サンプル3 TGGAAGCGGT 2-1_サンプル3 CGGGAGGAGAGA3


#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++ に非常に慣れていないため、大学院での研究を補うために C++ を使用する方法を独学で学ぼうとしています。私は遺伝学の博士号候補で、さまざまな進化の歴史をモデル化し、それらが集団全体の対立遺伝子の頻度にどのように影響するかを研究しています。

質問: 入力ファイルから作成した「dna」配列からデータの特定の部分を抽出しようとしています。たとえば、ここでは別の配列 "Af" を作成しました。そこでは、いわば dna 配列の最初の "セル" のカウントを抽出しようとしています。これを行う目的は、特定の細胞グループのカウントを DNA アレイ全体と比較して頻度を計算できるようにすることです。これを行う方法がわかりません。「「FLOAT[1][1]」への「FLOAT」の割り当てに互換性のないタイプがあります」

さまざまなフォーラムでこれを調査するのに多くの時間を費やしましたが、このエラーが何を意味するのか、達成しようとしていることを達成する方法を理解できないようです。

したがって、私が視覚化している DNA 配列は、4 つの行 (A、C、G、T) があるように入力ファイルから作成されます。次に 10 列 (一連のヌクレオチドごとに 1 列)。次に、この「グリッド」が 3 回スタックされます (入力ファイルにリストされているように、サンプルごとに 1 つの「シート」(ここでのサンプルは母集団を意味し、母集団ごとに 3 人の個体が存在します))。したがって、このグリッドのスタックから、たとえば、最初のセル (サンプル 1 の位置 1 の A の数) を抽出したいと考えています。次に、この数をすべてのサンプルの位置 1 の A の総数と比較します。この頻度は、テストしているモデルにとって意味のある数値になります。

問題は、dna配列の一部を抽出する方法がわからないことです.この要約された例を理解したら、非常に大きな入力ファイルに適用し、一度に複数のセルを抽出したいと思うでしょう.

4

1 に答える 1

0

Afは 3 次元配列です。

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

ただし、含まれる要素は 1 つだけです。1 つの行、1 つの列、および 1 つの「レイヤー」があります (または、3 番目の次元に名前を付けます)。それはそれを少し無意味にします。あなたはこれを持っているだけかもしれません:

float Af;

それにもかかわらず、あなたはそれを持っていません - あなたは3D配列を持っています. 次に、この行を見てみましょう。

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

したがって、最初に(0, 0, 0)from 番目の要素を取得しAfます (これは、今見たように、 の唯一の要素であり、そこにfrom 番目の要素Aを追加します。これらの要素は両方とも type であるため、そのビットは問題ありません。つまり:(i, j, j)dnafloat

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

したがって、この加算の結果もfloatです。では、この結果を何に割り当てようとしますか? に割り当てようとしましたがAf[0]、それは ではありませんfloat0最初の次元で th インデックスを簡単に指定しました。指定するディメンションが他に 2 つあります。の型Af[0]は実際には a float[1][1](s の 2 次元配列float) です。これは、たとえば次のように機能します。

Af[0][0][0] = Af[0][0][0] + dna[i][j][k];
// Or equivalently:
Af[0][0][0] += dna[i][j][k];

それがあなたのやりたいことかどうかは、私には理解できない問題に完全に依存しています。Afしかし、私が言ったように、要素が 1 つしかない 3 次元配列として持つことはほとんど意味がありません。1 つだけの場合は、配列ではなく にしますfloatfloat次に、上記の行を次のように実行します。

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