【发布时间】:2019-11-19 12:48:46
【问题描述】:
我的程序是 DNA 序列比对。它通过搜索所有序列中顺序相同的一系列字符来比较两个 DNA 序列。
我遇到了障碍,非常感谢一些帮助。我需要填充我的对齐矩阵,所以它最终看起来像这样:
这只是一个例子,两个 DNA 字符串可以是任何大小,我从一个单独的文件中导出,但我已经得到了所有这些。我只需要帮助将其实际放入矩阵中。
所以一开始我想制作一个二维字符数组,但后来我切换到二维字符串数组,因为我的 DNA 序列存储在两个字符串中。
MTX 填充指南:
顶行的所有插槽都应设置为间隙惩罚乘以它们的索引,即 0*gap、1*gap、2*gap……
沿左列的所有槽都应设置为间隙惩罚乘以它们的索引,即 0*gap、1*gap、2*gap……
从左上角最空的插槽开始,从左到右,从上到下,每个插槽都应根据以下约束填充: 如果slot位置对应的每个DNA字符串的字母相同,则slot的值应该是对角线上左slot的值加上匹配分数
如果每个序列对应的slot位置的字母不相同,那么slot的值应该是以下的最大值: 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
}
所以,我知道这是错误的,但这是我到目前为止所得到的。这是我试图用指定的字母和间隙/破折号初始化第一行和第一列。此外,应该使用间隙、匹配和不匹配来初始化矩阵的其余部分,但由于我什至还没有得到这部分,所以我还没有开始。如果有人能帮忙,我会永远爱你!
【问题讨论】:
-
string mtx[DNA2Size][DNA1Size];不是有效的 C++,因为DNA2Size和DNA1Size不是编译时常量。一些编译器在运行时支持“可变长度数组”作为特定于供应商的扩展。不要依赖那个。请改用std::vector或new[]在运行时动态分配可变长度数组。话虽如此,您的代码仍然无法按照您显示的方式工作,因为您正在尝试将单个char值分配给string数组元素。您使用 2Dchar数组的第一直觉是正确的 -
谢谢!我实际上已经初始化了字符串,但是我的程序太长了,我没有包括那部分。
-
您没有充分描述程序的预期输出,也没有充分描述实际输出。请根据Help Center 中列出的准则完善您的问题。