Извлечь столбец из матрицы в Переполнение стека

Я хотел бы извлечь столбец из класса матрицы, который имеет переменную A реализован как <vector<vector<T> > как это my_matrix(,2) и это должно извлечь мою вторую колонку. Также я не хочу имя функции get_col, потому что я уже использовал перегрузку operator () для извлечения строк. Я старался:

template<class T>
vector<T> & operator()(void, const int& col){
vector<T> Result(rows,0);
for(int i=0;i<rows;++i)
Result[i]=this->A[i][col];
return Result;
}

какие-либо предложения?

Класс состоит из:

template <class T> class QMatrix{
public:
int rows;
int cols;
vector<vector<T> > A;

3

Решение

func(,2) это недопустимо в C ++, нет способа сделать это.

Вы могли бы использовать operator() для доступа к ячейке в матрице, и иметь один row функция, которая извлекает всю строку, и один col функция, которая извлекает столбец.

Или вы можете перегрузить operator[] для получения колонки, но я подозреваю, что это немного запутает ваших пользователей. Я подозреваю перегрузку operator() получение одной строки также запутает ваших пользователей, это не очень C ++ -y.

3

Другие решения

Один из способов сделать это быстро (может работать для матриц небольшого размера) — сохранить в памяти 2 макета: один для матрицы и один для ее транспонирования. Таким образом, у вас есть последовательный доступ, и доступ будет чертовски быстрым (то есть доступ к k-ая строка будет эквивалентна указателю *row доступ из k*col_num в (k+1)*col_numв то время как доступ к k-й столбец будет обращаться к другому указателю *col от k*row_num в (k+1)*row_num,

Вы теряете в хранилище (т.е. необходимо дублировать элементы), но выигрываете во времени доступа. Если вы имеете дело с относительно небольшими матрицами, но частыми считываниями, это может быть способом.

В противном случае вы можете просто сохранить свою матрицу в виде одномерного вектора и получить к ней доступ через двумерные индексы, например M[i][j] = vec[i*col_num + j],

Просто сделайте несколько тестов и посмотрите, что лучше всего подходит для вашего случая использования.

1

Обход столбцов массивов очень дорог по сравнению с доступом к строкам из-за расположения массива в памяти. Это хорошо, что уродливо обращаться к массивам столбец за столбцом в C ++.

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

Как бы то ни было, вы можете определить функцию, которая возвращает vector который содержит указатели или ссылки (вам нужно будет использовать оболочку, как std::reference_wrapper для этого) к элементам конкретного столбца. Чтобы создать этот вектор, вам снова нужно получить доступ к каждому подвектору и получить ссылку / ptr на n-й элемент.

0
По вопросам рекламы [email protected]