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

c++ Looking for a clean and efficient way to get a sub-matrix

本文关键字:方法 有效 获取 寻找 一种      更新时间:2023-10-16

我正在使用向量向量来创建类似于以下内容的 2d 数组:

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++的基础知识,然后再转到第三方库。

你可以用对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);
}

使用将两个迭代器作为参数的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);
}