【问题标题】:Having trouble filling string array填充字符串数组时遇到问题
【发布时间】: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++,因为 DNA2SizeDNA1Size 不是编译时常量。一些编译器在运行时支持“可变长度数组”作为特定于供应商的扩展。不要依赖那个。请改用std::vectornew[] 在运行时动态分配可变长度数组。话虽如此,您的代码仍然无法按照您显示的方式工作,因为您正在尝试将单个 char 值分配给 string 数组元素。您使用 2D char 数组的第一直觉是正确的
  • 谢谢!我实际上已经初始化了字符串,但是我的程序太长了,我没有包括那部分。
  • 您没有充分描述程序的预期输出,也没有充分描述实际输出。请根据Help Center 中列出的准则完善您的问题。

标签: c++ arrays string matrix


【解决方案1】:

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

#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";
}


【讨论】:

    【解决方案2】:

    如果您想在开头存储 ' ' 和 '-' 符号,则需要考虑比序列大小多 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
    

    【讨论】:

    • 这个例子至少有两个问题: 1.它不会编译,因为行和列不是常量值。在功能齐全的应用程序中,它们不太可能是常量值,因为 seq1 和 seq2 的长度可能是可变输入。 2. 将矩阵声明为 char 数组是行不通的,因为从图中我们知道,如果某些元素需要包含多字符串,例如“-11”。
    • 1.这取决于编译器。例如,GNU GCC 编译器编译此代码,尽管行和列的值不是恒定的。但是好的,我同意,这不是通用的解决方案。我懒得添加几行来使用 new[] 构造动态分配内存。 2. 矩阵的某些元素需要包含-10、-11...等值,但这是数字,而不是字符串。所以把它存储在char中是没有问题的。
    • 1.如果出于某种未知原因我不得不使用数组,我会使用 std::make_unique 分配它,而不是 new[]。但我认为使用 std:vector 是一种更好的方法。 2.如果数组必须包含值,例如''、'-'、'A'、0、4、-11等一个字符,有时是一个有符号整数。这可能会或可能不会比使用字符串更好。如果一个元素需要包含多个字符或一个太大而无法放入 char 的整数,那么您必须使用字符串。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多