Я хотел бы извлечь столбец из класса матрицы, который имеет переменную 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;
func(,2)
это недопустимо в C ++, нет способа сделать это.
Вы могли бы использовать operator()
для доступа к ячейке в матрице, и иметь один row
функция, которая извлекает всю строку, и один col
функция, которая извлекает столбец.
Или вы можете перегрузить operator[]
для получения колонки, но я подозреваю, что это немного запутает ваших пользователей. Я подозреваю перегрузку operator()
получение одной строки также запутает ваших пользователей, это не очень C ++ -y.
Один из способов сделать это быстро (может работать для матриц небольшого размера) — сохранить в памяти 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]
,
Просто сделайте несколько тестов и посмотрите, что лучше всего подходит для вашего случая использования.
Обход столбцов массивов очень дорог по сравнению с доступом к строкам из-за расположения массива в памяти. Это хорошо, что уродливо обращаться к массивам столбец за столбцом в C ++.
Определение функций-членов или операторов перегрузки просто скрывает единственный способ сделать это: перейти к каждой строке и перейти к столбцу, к которому вы хотите получить доступ.
Как бы то ни было, вы можете определить функцию, которая возвращает vector
который содержит указатели или ссылки (вам нужно будет использовать оболочку, как std::reference_wrapper
для этого) к элементам конкретного столбца. Чтобы создать этот вектор, вам снова нужно получить доступ к каждому подвектору и получить ссылку / ptr на n-й элемент.