2015-04-06 175 views
3

我想从一个矩阵类中提取一列,其中的变量A实现为<vector<vector<T> >,像这样my_matrix(,2)并且应该提取我的第二列。此外,我不想要一个函数名称get_col,因为我已经使用operator()重载来提取行。我试过了:在C++中从矩阵中提取列

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; 
+1

这个语法在C++中是不可能的。 –

+0

也许我们可以使用一个把戏:) – moldovean

回答

3

func(,2)是不是在C++的法律,有没有办法来实现这一目标。

您可以使用operator()来访问矩阵中的一个单元格,并且具有一个检索整行的row函数和一个检索列的函数。

或者你可以重载operator[]获得一个列,但我怀疑这会混淆你的用户相当多。我怀疑超载operator()得到单行也会混淆你的用户,这不是很C++ - y。

+0

我去重载运算符()。 (int,int)用于矩阵的元素,(int)用于行 – moldovean

0

由于内存中数组的布局,遍历数组的列与线访问相比非常昂贵。这使得在C++中逐列访问数组很糟糕。

定义成员函数或重载操作符只是隐藏实现它的唯一方法:转到每一行并转到您想要访问的列。

你可以怎么定义一个函数返回一个vector,该函数持有指针或引用(你将需要使用像std::reference_wrapper这样的包装)到特定列的元素。要创建该向量,您需要再次访问每个子向量并将参考/ ptr获取到第n个元素。

+0

我已经做了 – moldovean

+0

不在您的代码上面 – Otomo

1

快速执行此操作的一种方法(可能适用于非 - 大型矩阵)是将2个布局存储在内存中:一个用于矩阵,另一个用于其转置。通过这种方式,您可以顺序访问,并且访问速度相当快(即,访问第k列将等于从k*col_num(k+1)*col_num的指针*row访问,而访问第k列将访问其他指针*colk*row_num(k+1)*row_num

你失去了在存储空间(即,需要复制的元素)的访问时间,但收益。如果你对付比较小的矩阵,但频繁的读数,这可能是一种方式

否则,您可以将您的矩阵存储为一维向量,并通过二维索引访问它,如M[i][j] = vec[i*col_num + j]

只要做一些基准测试,看看什么最适合您的使用情况。

+0

这是一个有趣的想法..做一个转置,然后获取行的A(int) 。每次更改矩阵时,都必须转置每个矩阵,并更新其转置(甚至更糟糕的是计算新的转置)。 – moldovean

+0

如果您经常或顺序更改元素,这会带来很大的不便 – Otomo

+0

@Otto确实是 – vsoftco