Эффективный способ получения значений в определенной области 2D вектора - PullRequest
0 голосов
/ 09 марта 2020

Скажем, например, у меня есть двумерный вектор целых чисел, например:

0,1,4,7,3,7,3,7,7,2
3,6,3,1,7,9,2,8,3,6
1,4,9,3,5,8,3,2,8,5
2,5,8,4,9,3,2,9,0,1
3,6,3,1,7,9,2,8,3,6
1,4,9,3,5,8,3,2,8,5

, и я хочу получить другой двумерный вектор, который содержит значения от индекса 2 до 5 по горизонтали и индексы от 1 до 3 по вертикали я проиллюстрирую нужные мне значения с помощью '■'.

0,1,4,7,3,7,3,7,7,2
3,6,■,■,■,■,■,8,3,6
1,4,■,■,■,■,■,2,8,5
2,5,■,■,■,■,■,9,0,1
3,6,3,1,7,9,2,8,3,6
1,4,9,3,5,8,3,2,8,5

2D-вектор, который я хочу в этом случае:

3,1,7,9,2
9,3,5,8,3
8,4,9,3,2

Мне нужно, чтобы это было очень эффективно, так как я использование его в сверточной нейронной сети для получения области входного изображения, над которой в данный момент находится фильтр, и это необходимо будет делать тысячи раз. (в моем случае я буду использовать его для извлечения трехмерного вектора из другого трехмерного вектора, но я предполагаю, что его масштабирование не должно быть слишком сложным, и гораздо проще объяснить мою идею с использованием двумерных векторов)

1 Ответ

0 голосов
/ 09 марта 2020

Я сделал для вас функцию получения подматрицы из матрицы

std::vector<std::vector<int>> subMatrix(std::vector<std::vector<int>>& matrix, 
    unsigned int x, unsigned int y, unsigned int width, unsigned int height) {
    std::vector<std::vector<int>> submatrix;
    for(int i = 0; i < width; i ++) {
        std::vector<int> vect;
        for(int j = 0; j < height; j ++)
            vect.push_back(matrix[i + x][j + y]);
        submatrix.push_back(vect);
    }
    return submatrix;
}

А также еще одну функцию для отображения матриц:

void showMatrix(std::vector<std::vector<int>>& matrix) {
    for(std::vector<int> vect : matrix) {
        for(int n : vect) {
            std::cout << n << " ";
        }
        std::cout << "\n";
    }
}

Вот как я используя их:

int main(void) {

    std::vector<std::vector<int>> matrix = {
        {0,0,0,0},
        {0,1,0,0},
        {0,0,1,0},
        {0,0,0,0},
    };
    showMatrix(matrix);

    std::cout << "\n";
                                                           //  x, y, width, height
    std::vector<std::vector<int>> submatrix = subMatrix(matrix, 1, 1, 3, 3);
    showMatrix(submatrix);

    return 0;
}

Вывод:

0 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0

1 0 0
0 1 0
0 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...