在C ++中的Matrix中引用get_row和get_column

时间:2017-04-16 07:17:41

标签: c++ matrix vector

我有一个矩阵,我如何get_row()按行引用?get_column按列参考?

其中一个我不能通过引用得到(我尝试通过行主ordering和列主ordering但它没有解决这个问题,因为我需要通过引用得到两个)。如何重新定义(覆盖)vector来解决此问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

首先,不要忽视所有要求您发布课程代码的人。

那就是说,你可以做的是定义一些与行或列的迭代器相当的东西。不是你实际要求的,但由于行和列的内存不能连续,所以无论如何都需要一个自定义类型。

这是一个示例布局,当然省略了很多东西。我没有太多考虑过它,可能很容易就是有更好的模式。我将矩阵类创建为一个超过double的类,很可能你会使用模板。

class Matrix{

    class RowIterator;

    friend class RowIterator;

    private:
        vector<vector<double> > data;

    public:

        RowIterator row_iterator(const unsigned int row);

    }

class Matrix::RowIterator{

    private:
        Matrix* parent;
        unsigned int row;
        unsigned int col;

    public:

        double& operator * ();
        RowIterator& operator++()
        bool equals(const unsigned int column) const;
}

double& Matrix::RowIterator::operator * (){
    return parent->data[row][col];
}
Matrix::RowIterator& Matrix::RowIterator::operator++(){
    col++;
    return *this;
}
bool equals(const unsigned int column) const{
    return column == col;
}

和ColumnIterator同样(或者作为一个存储的类和它的附加成员),也定义

inline bool operator==(const Matrix::RowIterator& lhs, const unsigned int rhs){
    return lhs.equals(rhs)
}

同样反过来和!= - 运算符

能够执行像

这样的代码
for(Matrix::RowIterator it = matrix.row_iterator(desired_row); it != matrix.columns(); it++)

(或者选择带有导致

的东西
for(Matrix::RowIterator it = matrix.row_iterator(desired_row); it.at_valid_position(); it++)

同样,可能有更好的模式,不确定。对于比我更了解这一点的人的编辑会很高兴。

另外,当然这可以简单地通过用矩阵和所需的行提供东西来完成,并让它简单地遍历列本身 - 因此我不确定发布这个答案。取决于你想做什么以及有机逻辑是什么 - 除了你的矩阵代码之外,你还会建议你清楚地描述你想对这些参考做些什么。

答案 1 :(得分:0)

另一种方法,更像矢量:

enum MatrixSubVectorType{ row_vector, column_vector };

class MatrixSubVector{

private:

    MatrixSubVectorType type;
    unsigned int fixed_coordinate;
    Matrix* parent;

public:

    double& operator[] (unsigned int i);
    const double& operator [] (unsigned int i);

    unsigned int size() const;
}

double& MatrixSubVector::operator[] (unsigned int i) {

    if(type == row_vector){
        return (*parent)(fixed_coordinate, i);
    }
    return (*parent)(i, fixed_coordinate);
}

unsigned int MatrixSubVector::size() const {

    if(type == row_vector){
        return parent->columns();
    }
    return parent->rows()
}

当然,很多东西都省略了,比如构造函数,只是为了显示模式。与其他模式一样,我将它作为Matrix的内部类,将Matrix作为朋友,构造函数是私有的,该类的对象只能由Matrix方法创建。