在C ++中从矩阵中提取列

时间:2015-04-06 21:37:37

标签: c++ matrix data-extraction

我想从矩阵类中提取一个列,其中变量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 个答案:

答案 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列将访问从*colk*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个元素。