填充字符串数组时遇到问题

时间:2019-07-09 23:00:08

标签: c++ arrays string matrix

我的程序是DNA序列比对。它通过搜索所有序列中顺序相同的一系列字符来比较两个DNA序列。

我遇到了障碍,非常感谢您的帮助。我需要填写对齐矩阵,以便最终看起来像这样:

OUTPUT

这只是一个例子,两个DNA字符串可以是我从一个单独的文件中得出的任意大小,但我已经拥有了所有这些。我实际上只需要帮助就可以将其放入矩阵中。

因此,起初我在考虑制作2D字符数组,但是后来我切换到2D字符串数组,因为我的DNA序列存储在两个字符串中。

填充MTX的准则:

顶部行中的所有插槽都应设置为间隙罚分乘以它们的索引,即0 * gap,1 * gap,2 * gap ...

沿左列的所有插槽都应设置为间隙罚分乘以其索引,即0 * gap,1 * gap,2 * gap ...

▪从最左上角最空的插槽开始,从左到右,从上到下开始工作,每个插槽应根据以下约束进行填充:   如果与插槽位置相对应的每个DNA字符串的字母相同,则插槽的值应为对角线,上下插槽的值加上匹配分数

如果与插槽位置相对应的每个序列的字母不同,则该插槽的值应为以下各项的最大值:    o上插槽的值加上空位罚分    o左侧广告位的值加上空位罚分    o对角线的上,左插槽的值加上不匹配罚分

这里有一些代码:

int match = 1;
int mismmatch = 7;
int gap = -1;

string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA
string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

int DNA1Size = seq1.length();
int DNA2Size = seq2.length();

string mtx[DNA2Size][DNA1Size];

matrix[0][0] = " ";
matrix[0][1] = "-";
matrix[1][0] = "-";

for(int i = 2; i < DNA2Size; i++)
{
    mtx[i] = seq2.at(i);     //Hoping this would initialize the first row with sequence 2 
}

for(int z = 2; z < DNA1Size; z++)
{
    mtx[z] = seq1.at(z);    ////Hoping this would initialize the first column with sequence 1
}

所以,我知道这是错误的,但到目前为止我已经知道了。这是我尝试使用指定的字母和空格/破折号初始化第一行和第一列。另外,应该使用间隙,匹配和不匹配来初始化矩阵的其余部分,但是由于我还没有得到这一部分,所以我还没有开始。如果有人可以帮助,我会永远爱你!

2 个答案:

答案 0 :(得分:0)

这种方法应该可以帮助您:

#include <iostream>
#include <string>
#include <vector>

using std::string;
using std::vector;
using Matrix = vector<vector<string>>;

int main()
{
    string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA
    string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

    int DNA1Size = seq1.length();
    int DNA2Size = seq2.length();
    const int numHdrCells = 2;

    Matrix matrix(DNA2Size + numHdrCells, vector<string>(DNA1Size + numHdrCells));
    matrix[0][0] = " ";
    matrix[0][1] = "-";
    matrix[1][0] = "-";

    for (int i = 0; i < DNA1Size; i++) {
        matrix[0][i + numHdrCells] = seq1.at(i);     //Hoping this would initialize the first row with sequence 1
    }

    for (int z = 0; z < DNA2Size; z++) {
        matrix[z + numHdrCells][0] = seq2.at(z);    ////Hoping this would initialize the first column with sequence 2
    }
    std::cout << "Hello World!\n";
}


答案 1 :(得分:0)

如果要在开头存储''和'-'符号,则需要考虑到比行的大小多2行和更多列。

要填充矩阵的第一行,请将行的索引保持为0,并更改列(单元格)的循环索引。要填充列,您需要执行相反的操作-保留列0的索引并更改行的索引。 解决方案示例:

string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA 
string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

int DNA1Size = seq1.length();
int DNA2Size = seq2.length();
int i, rows, columns;
rows = DNA2Size + 2;
columns = DNA1Size + 2;

char matrix[rows][columns]; //some compiler allow to define matrix this way

matrix[0][0] = ' ';
matrix[0][1] = '-';
matrix[1][0] = '-';

for (i=0; i<DNA2Size; i++)
  matrix[i+2][0] = seq2.at(i);  //filling first column

  for (i=0; i<DNA1Size; i++)
    matrix[0][i+2] = seq1.at(i); //filling first row