0

我正在为数值计算制作自定义向量和矩阵类。

我想将矩阵的每一行和每一列都视为一个向量。另外,我不想使用额外的内存,因此,我创建了 VectorView 类,它直接使用矩阵中的数据(如 GSL 库)。这是我的矩阵类的大纲。

class Matrix{
priavte:
    T data[];
    ....
public:
    VectorView row(int n);
    VectorView colum(int n);
};

我定义了一个使用 VectorView 的函数。

myFunc(VectorView& v);

我的 VectorView 类有一些额外的数据,因此我想使用 VectorView 作为参考来节省内存。

但是,当我调用这样的函数时遇到了问题。

Matrix m;
...
...
myFunc(m.row(i));

问题是 m.row(i) 返回临时对象,因此我不能使用引用类型来处理它。但

auto v = m.row(i);
myFunc(v);

即使使用 v 完全相同但不清楚的原因,这也不会出错。我想使用上面的那个。这类问题有什么绝妙的解决方案吗?

4

6 回答 6

0

写两个VectorViews:VectorViewConstVectorView. 第一个包含数据切片的视图,并且方法是const当且仅当它不改变您正在查看的切片更改成员可以const通过VectorView.

ConstVectorView是一个向量的视图,其中改变元素的值是非法的。您可以使用非方法更改您正在查看的const内容,并且您可以使用方法访问要读取的元素const

您应该能够ConstVectorView从 a 构造 a VectorView

然后,当您返回 aVectorView并将其传递给函数时,该函数应该按值或按const&. 如果函数不修改其内容,它需要一个ConstVectorView.

于 2013-06-10T21:46:43.320 回答
0

使用 valarray 和 gslice

http://www.cplusplus.com/reference/valarray/gslice/

ND(包括 2D)矩阵是 Bjarne 添加 gslices (AFAIK) 的原因

于 2013-06-10T21:17:12.973 回答
0

不要重新发明轮子并使用 Eigen

eigen.tuxfamily.org

是一个只有头文件的 c++ 矩阵库,具有非常好的支持和性能

于 2013-06-10T21:18:33.357 回答
0

猜猜你的矢量视图只包含一个指向原始数据的指针和一个用于步骤的整数(1 表示行,n 表示列)。在这种情况下,将其视为值对象就可以了(只要您确保矩阵的生命周期良好)。所以如果你想要语法,你可以在 myFunc 中使用 value。喜欢:myFunc(VectorView) ...

于 2013-06-10T21:19:01.263 回答
0

row返回一个右值引用 ( VectorView&&),它不能作为非 const 左值引用 ( VectorView&) 传递。您可以重新定义myFuncmyFunc(const VectorView& v)myFunc(VectorView&& v),具体取决于您的要求和VectorView.

如果myFunc需要访问 的非 const 成员VectorView,则需要定义后者,它将返回值 from 传递给rowusing myFuncmove 语义。但是,由于VectorView只是原始数据的“视图”,它可能没有(或不需要)任何非常量成员,在这种情况下,您应该使用前者。

于 2013-06-10T21:15:58.910 回答
0

让你的生活变得简单,并坚持 C 风格的语义(这允许你使用大量可用的 C 线性代数代码,以及易于使用的 fortran 代码)。

您声明您担心使用额外的内存,但如果您只是担心并且没有严格的界限,请确保您以行和列格式存储矩阵。这对于从常见的矩阵运算中获得任何类型的性能至关重要(因为您一次将使用整个缓存行)。

class Matrix{
private:
    T rowData[];
    T colData[];
    ...
public:
    T const * row(int n) const;
    T const * colum(int n) const;
    ...
};
于 2017-06-26T17:30:31.003 回答