SquareTriangularMatrix

SquareTriangularMatrix

我正在尝试实现一系列为三角形或对称矩阵提供(公共(public))接口(interface)的类,但我想避免复制内存(即进行大量就地操作)。

我想用C++做到这一点的方法是实现一个类或结构,该类或结构只是一个包含矩阵数据的 vector (因为我只关心三角矩阵,所以我只需要存储大约一半的矩阵)。我们将此称为“数据承载”类 SquareTriangularMatrix 。现在,根据将数据视为上三角,下三角甚至对称数据的方式,可以不同地访问该矩阵内的数据。

我不认为可以在我的情况下应用多态性,因为我希望的同一对象SquareTriangularMatrix 的对象根据上下文具有不同的接口(interface)。有时 SquareTriangularMatrix 可被视为下三角矩阵,但其他一些可能是其转置:上三角矩阵,依此类推。

有没有解决此问题的设计模式?在此上下文中的任何提示或指导将不胜感激。

非常感谢

最佳答案

您可以为存储类创建适配器类,如下所示:

struct SquareTriangularMatrix {
    // constructor, maybe operator[], etc
    int* values;
    int nrows;
    int ncolumns;
};

struct UpperTriangleMatrix {
    UpperTriangleMatrix (SquareTriangularMatrix& data): data(data) {}
    int at (unsigned row, unsigned column) const {
        if (row > column) return 0;
        return data.values [row * data.ncolumns + column];
    }
private:
    SquareTriangularMatrix& data;
};

然后,您可以将该类UpperTriangleMatrix嵌套在SquareTriangularMatrix中,并添加一个类似于SquareTriangularMatrix::as_upper()的函数,该函数将返回使用此矩阵构造的适配器。

您可以采用的另一种方法是在as中创建一个函数SquareTriangularMatrix,该功能将允许以后添加自定义适配器,如下所示:
struct SquareTriangularMatrix {
    //...
    template <class T> T
    as () { return T(*this); }
};

//usage:
SquareTriangularMatrix m;
auto upper = m.as <UpperTriangleMatrix>();

使用这种方法,您可以随时将矩阵转换为希望满足as模板(非常简单和广泛)的任何适配器,并在本地扩展任何文件中的适配器列表。

您还可以遵循STL允许转换时间(std::duration_cast)的方式:
template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }

SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);

它的工作方式与上一个示例中的as<>函数相同,只是一个口味问题。

关于c++ - 单个 “data-carrying”类的各种接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37208507/

10-13 00:32