поменять местами внутренний и внешний вектор - PullRequest
3 голосов
/ 18 августа 2011

У меня есть вектор vector myObjects, созданный по сути 2D-массивом. Я хотел бы переместить этот массив так, чтобы строки стали столбцами, а столбцы стали строками. Очевидно, я мог бы сделать это в двойном цикле for, но это кажется чрезвычайно сложным и будет довольно медленным. Мне было интересно, есть ли что-нибудь умное в C ++ или STL, которое позволило бы мне быстро и эффективно поменять местами внутренние и внешние векторы, а не писать ...

for (int iRow = 0; iRow < nRows; ++iRow)
{
      for (int iCol = 0; iCol < nCols; ++iCol)
      {
         myNew2DArray[iCol][iRow] = myOriginal2DArray[iRow][iCol];
      }
}

Ответы [ 4 ]

1 голос
/ 22 сентября 2011

Кроме того, вы можете сохранить матрицу в векторе и иметь флаг, который определяет, будет ли матрица транспонирована или нет. Тогда вы просто рассчитываете индекс. Вот пример:

class Matrix {
private:
    std::vector<int> matrix;
    bool isTransposed = false;
    int width, height;

public:
    // ...

    int getElement(int x, int y)
    {
        int w = width;
        int h = height;

        if(isTransposed) {
            int z = x;
            x = y;
            y = x;

            z = w;
            w = h;
            h = z;
        }

        return matrix[y * width + x];
    }

    // ...
};

Это уменьшит стоимость транспонирования матрицы, но увеличит стоимость фактического доступа к элементам.

0 голосов
/ 22 сентября 2011

Лучше всего использовать матричную библиотеку Eigen, которая сохраняет свойство транспонирования в параметре класса матрицы. Если это не вариант, Google для одного из многочисленных алгоритмов транспонирования матрицы.

0 голосов
/ 22 сентября 2011

То, что вы уже написали, в значительной степени самый простой способ.На самом деле вам не нужен вектор векторов.Вы можете просто добавить каждую новую «строку» к одному вектору.Тогда то, что было бы элементной матрицей [i] [j] в исходном векторе векторов, теперь является матрицей [(i * n) + j], когда n - это ширина вашей матрицы.Непростая задача - придумать алгоритм для выполнения транспонирования.Я не говорю, что этот путь лучше, но это альтернативный маршрут, и то, что у вас уже есть, хорошо.

0 голосов
/ 19 августа 2011

Я бы предложил создать класс с именем Matrix, содержащий матрицу, о которой вы говорите.Дайте классу функцию transpose(), которая переключает флаг состояния для состояния "транспонированный".Затем перегрузите оператор [], чтобы следовать предложению mwd об инверсии индексов, когда матрица находится в транспонированном состоянии.

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