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

車輪を再発明せず、Eigen を使用する

eigen.tuxfamily.org

非常に優れたサポートとパフォーマンスを備えたヘッダーのみの C++ マトリックス ライブラリです。

于 2013-06-10T21:18:33.357 に答える
0

ベクタービューには、元のデータへのポインターとステップの整数 (行の場合は 1、列の場合は n) のみが含まれていると思います。その場合、それを値オブジェクトとして扱っても問題ありません (マトリックスのライフサイクルが良好であることを確認する限り)。したがって、構文が必要な場合は、myFunc で値を使用できます。のように: myFunc(VectorView) ...

于 2013-06-10T21:19:01.263 に答える
0

rowVectorView&&非 const 左辺値参照 ( ) として渡すことはできませんVectorView&。要件と の動作に応じて、またはmyFuncとして再定義できます。myFunc(const VectorView& v)myFunc(VectorView&& v)VectorView

myFuncの非 const メンバーにアクセスする必要がある場合は、後者を定義する必要があります。これにより、移動セマンティクスを使用してVectorViewから返された値が渡されます。ただし、元のデータの単なる「ビュー」であるため、非 const メンバーがない (または必要ない) 可能性があります。その場合は、前者を使用する必要があります。rowmyFuncVectorView

于 2013-06-10T21:15:58.910 に答える
0

valarray と gslice を使用する

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

ND (2D を含む) 行列が、Bjarne が gslices を追加した理由です (AFAIK)

于 2013-06-10T21:17:12.973 に答える
0

2 つVectorViewの s:VectorViewとを記述しConstVectorViewます。1つ目はデータのスライスのビューを保持し、メソッドは、見ているスライスを変更constない場合です。メンバーの変更は の方法でOKです。constVectorView

ConstVectorView要素の値の変更が不正なベクトルのビューです。非constメソッドを使用して表示内容を変更したり、メソッドを使用して要素にアクセスして読み取ることができますconst

ConstVectorViewからを構築できるはずですVectorView

次に、 a を返してVectorView関数に渡すとき、関数はそれを値で受け取るか、 で受け取る必要がありますconst&。関数が内容を変更しない場合は、ConstVectorView.

于 2013-06-10T21:46:43.320 に答える