我的程序是DNA序列比对。它通过搜索所有序列中顺序相同的一系列字符来比较两个DNA序列。
我遇到了障碍,非常感谢您的帮助。我需要填写对齐矩阵,以便最终看起来像这样:
这只是一个例子,两个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
}
所以,我知道这是错误的,但到目前为止我已经知道了。这是我尝试使用指定的字母和空格/破折号初始化第一行和第一列。另外,应该使用间隙,匹配和不匹配来初始化矩阵的其余部分,但是由于我还没有得到这一部分,所以我还没有开始。如果有人可以帮助,我会永远爱你!
答案 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