2012-04-05 16 views
1

STLコンテナ(たとえば、std :: vectorなど)を使用して、行列変数(つまり、列ベクトルの束)をメモリ内で連続させる方法を探しています)。 &mat[1][0]Ncolumn1の長さ&mat[0][N-1] + 1、に等しくないという意味で連続していないSTLコンテナを使用して連続する行列変数を作成する

vector< vector<float> > mat; 
mat.push_back (column1); // column1 is of type vector<float> 
mat.push_back (column2); // column2 is of type vector<float> 

:1つのオプションは、これです。メモリ内の連続ですが、私を強制

vector<float> mat; 
float f1[] = {1., 2., 3.}; 
float f2[] = {4., 5., 6.}; 
mat.insert (mat.end(), f1, f1 + 3); 
mat.insert (mat.end(), f2, f2 + 3); 

はfloatの配列を使用するには、次の

別のオプション

はこれです。

EDIT

それを明確にするためには、私はvector < vector<float> >のようなオプションを好むので、私はSTLベクトルとして与えられた列にアクセスすることができます。

+0

何が質問ですか? –

+0

それは 'mat.insert(mat.end()、f2、f2 + 3);' –

+0

なぜメモリ内で連続している必要がありますか? –

答えて

3

私はstd::vector<float>を格納用のバックエンドとして使用する独自の行列クラスを作成します。

2

これは私が知る限り、標準ライブラリでは簡単にはできませんが、Boostのmultidimensional arraysを使うことができます。

0

thisが役立つかどうかを確認します(コラムメジャーストレージが必要な場合はおそらくソースコードを変更する必要があります)。

2

サブクラスa vector<float>。サイズはrowSize*colSizeです。メモリは単一のベクトルなので連続しています。

列にベクトルとしてアクセスする部分については、列の範囲を示すために2つのイテレータを使用して列にアクセスすることを検討してください。 RandomAccessIterator準拠のイテレータを使用する列のアルゴリズムを変更するか、Columnクラスを使用して2つのイテレータをラップし、開始イテレータのアドレスをT& operator[](size_t)に計算します。

+0

ただし、標準クラスから派生させないでください。 – GManNickG

+0

これも問題ありません。 – devil

2

データが実際に連続していることを確認するには、要件に応じてスタティックまたはダイナミックサイズの単一の配列型オブジェクトに基づいて、ブック管理とアクセスをすべて処理する必要があると思います。 boost matricesをご覧ください。しばらく前に私はstatic-sized matricesで働いていましたが、私はあなたがそのものを使うことを示唆していませんが、それはどのように行うことができるか(古い。ファッション)の例です。

関連する問題