我想从矩阵类中提取一个列,其中变量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;
答案 0 :(得分:3)
func(,2)
在C ++中是不合法的,没有办法实现这一点。
您可以使用operator()
访问矩阵中的单元格,并使用一个row
函数检索整行,并使用一个col
函数检索列。
或者您可以重载operator[]
来获取列,但我怀疑这会让您的用户感到非常困惑。我怀疑超载operator()
以获得单行也会使用户感到困惑,这不是很C ++ - y。
答案 1 :(得分:1)
快速执行此操作的一种方法(可能适用于不大型矩阵)是在内存中存储2个布局:一个用于矩阵,一个用于转置。通过这种方式,您可以进行顺序访问,并且访问速度非常快(即,访问k
行将等同于从*row
到{k*col_num
的指针访问(k+1)*col_num
{1}},而访问k
列将访问从*col
到k*row_num
的另一个指针(k+1)*row_num
。
您在存储空间中丢失(即需要复制元素),但获得访问时间。如果你处理相对较小的矩阵,但频繁的读数,这可能是一种方法。
否则,您可以将矩阵存储为1-D向量,并通过2-D索引访问它,如M[i][j] = vec[i*col_num + j]
。
只需进行一些基准测试,看看什么最适合您的使用案例。
答案 2 :(得分:0)
与线路访问相比,遍历数组列非常昂贵,因为内存中的数组布局。这使得在C ++中逐列访问数组很难看。
定义成员函数或重载操作符只是隐藏完成它的唯一方法:转到每一行并转到要访问的列。
您可以如何定义一个函数,该函数返回一个vector
,它保存指针或引用(您需要使用类似std::reference_wrapper
的包装器)到特定列的元素。要创建该向量,您需要再次访问每个子向量并将引用/ ptr获取到第n个元素。