c ++寻找一种干净有效的方法来获得子矩阵

时间:2017-04-24 02:50:29

标签: c++ matrix

我正在使用矢量矢量来创建类似于:

的二维数组
std::vector<std::vector<int> > matrix = {
        {1, 2, 3, 4, 4, 6, 7, 8, 9},
        {1, 2, 3, 5, 4, 6, 7, 8, 9},
        {1, 2, 3, 4, 4, 6, 7, 8, 9}
    };

现在我想提取一个规范为:

的子矩阵
1) all rows
2) the first 4 columns

我是c++的新手,所以我现在提出的最好的是:

if (matrix[n][m-1] >= matrix[n][m])
    {
        std::vector<std::vector<int> > submatrix(3);
        for (int i=0; i < 3; i++) {
            std::vector<int> slice(m);
            for (int j=0; j < m; j++){
                slice[i] = matrix[i][j];
            }
            submatrix[i] = slice;
        }
        return find_a_peak(submatrix);
    }

m = 4;

这仅适用于练习,所以请建议一个干净的方法来做到这一点。我是训练有素的python程序员,所以在numpy这很容易。但是在转到第三方库之前,我想学习c++的基础知识。

2 个答案:

答案 0 :(得分:1)

您可以通过调用std::vector的构造函数替换内部循环来获取迭代器,并使用std::next从头开始获取迭代器的四个元素:

if (matrix[n][m-1] >= matrix[n][m]) {
    std::vector<std::vector<int>> submatrix;
    for (int i=0; i < 3; i++) {
        submatrix.push_back(matrix[i].begin(), std::next(matrix[i].begin(), m));
    }
    return find_a_peak(submatrix);
}

答案 1 :(得分:0)

使用带有两个迭代器作为参数的std::vector构造函数。

if (matrix[n][m-1] >= matrix[n][m])
{
   std::vector<std::vector<int> > submatrix; 
    for (int i=0; i < matrix.size(); i++) {
        submatrix.push_back(std::vector<int>(matrix[i].begin(), matrix[i].begin() + m));
    }
    return find_a_peak(submatrix);
}