Получить вектор строки 2d вектора в C ++ - PullRequest
0 голосов
/ 07 марта 2019

У меня вектор вектора в C ++, определенный с помощью: vector < vector<double> > A;

Давайте предположим, что A был заполнен некоторыми значениями.Есть ли быстрый способ извлечь вектор строки из A?

Например, A[0] даст мне вектор первого столбца, но как я могу быстро получить вектор первого ряда?

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Не существует «быстрого» способа с этой структурой данных, вы должны перебирать каждый вектор столбца, получать значение для нужной строки и добавлять его во временный вектор строки.Будет ли это достаточно быстро для вас или нет, зависит от того, что вам нужно.Чтобы сделать его максимально быстрым, обязательно выделите нужное количество пространства в целевом векторе строки, чтобы его не нужно было изменять при добавлении значений.

Простое решение проблемы производительностииспользовать некоторую существующую матричную библиотеку, такую ​​как Eigen, предложенную в комментариях.

Если вам нужно сделать это самостоятельно (потому что это назначение, или из-за проблем с лицензированием, или что-то еще), вы, вероятно, должны создать свою собственнуюКласс «Матрица 2D» и скрытие деталей реализации в нем.Затем, в зависимости от того, что именно вам нужно, вы можете использовать такие приемы, как:

  • имеет «кэш» для строк, поэтому, если одна и та же строка извлекается много раз, ее можно извлечь из кеша и новойvector не нужно создавать
  • хранить данные как вектор векторов строк, так и вектор векторов столбцов, поэтому вы можете получать либо строки, либо столбцы в постоянное время, за счет использования большего количества памяти и внесения измененийВ два раза дороже из-за дублирования данных
  • динамически изменяет внутреннее представление в соответствии с текущими потребностями, поэтому вы получаете фиксированное использование памяти, но вам необходимо оплатить стоимость обработки, когда вам нужно изменить внутреннее представление
  • хранит данные в плоском векторе с размером строк * столбцов и вычисляет правильное смещение в вашем собственном коде из строки и столбца

Но стоит повторить: кто-то уже сделал это для вас,так что попробуйте использовать существующую библиотеку, если можете ...

1 голос
/ 07 марта 2019

Нет действительно быстрого способа сделать это. Также, как было указано, я бы сказал, что это соглашение наоборот, то есть A[0] на самом деле является первой строкой, а не первым столбцом. Однако даже пытается получить столбец не совсем тривиально, так как

{0, 1, 2, 3, 4}
{0}
{0, 1, 2}

очень возможно vector<vector<double>> A, но нет реального столбца 1, 2, 3 или 4. Если вы хотите применить поведение, подобное столбцам одинаковой длины, неплохо было бы создать класс Matrix (или использовать библиотеку).

Вы можете написать функцию, которая будет возвращать vector<double>, перебирая строки и сохраняя соответствующее значение столбца. Но вы должны быть осторожны с тем, хотите ли вы скопировать или указать значения матрицы (vector<double> / vector<double *>). Это не очень быстро, так как значения не находятся рядом друг с другом в памяти.

0 голосов
/ 07 марта 2019

Ответ: в вашем случае нет соответствующей простой опции, как для столбцов. И одна из причин в том, что vector> - это конкретный плохо подходящий контейнер для многомерных данных.

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

Например, в вашем случае: вы сами можете назвать A [0] «столбцом» или «строкой». Вам нужно только делать это последовательно (лучше всего определить небольшой интерфейс, который делает это явным). Но СТОП, не делай этого:

Это выводит вас на следующий уровень: для многомерных данных вы обычно не используете vector> (но это другая проблема). Посмотрите на умные и эффективные решения, уже существующие, например. в убласе https://www.boost.org/doc/libs/1_65_1/libs/numeric/ublas/doc/index.html или собственном3 https://eigen.tuxfamily.org/dox/

Вы никогда не сможете побить эти высокооптимизированные библиотеки.

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