1

STL コンテナー (std::vector など) を使用して、メモリ内で連続する Matrix 変数 (順序付けられた列ベクトルの束) を取得する方法を探しています。1 つのオプションは次のとおりです。

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

&mat[1][0]これは、と等しくないという意味で連続していません。&mat[0][N-1] + 1ここで、Nは の長さですcolumn1

別のオプションはこれです:

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);

これはメモリ内で連続していますが、浮動小数点数の配列を使用する必要があります。

編集

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

4

5 に答える 5

3

std::vector<float>ストレージのバックエンドとしてを使用する独自のマトリックス クラスを作成します。

于 2012-04-05T09:03:37.763 に答える
2

サブクラス a vector<float>。サイズのメーカーrowSize*colSize。メモリは 1 つのベクトルであるため、連続しています。

ベクトルとして列にアクセスする部分については、代わりに、2 つの反復子を使用して列にアクセスし、列の範囲をマークすることを検討してください。列のアルゴリズムを変更して適合するイテレータで動作するようにするか、 の開始イテレータからアドレスを計算するクラスをRandomAccessIterator使用して 2 つのイテレータをラップします。ColumnT& operator[](size_t)

于 2012-04-05T09:13:02.447 に答える
2

データが実際に連続していることを確認するには、要件に応じて静的または動的なサイズの単一の配列型オブジェクトに基づいて、すべての簿記とアクセスを処理する必要があると思います。ブーストマトリックスを見てください。しばらく前に、私は静的サイズの行列に取り組みました。そのようなものを使用することはお勧めしませんが、それがどのように行われるかの (昔ながらの) 例です。

于 2012-04-05T09:21:35.133 に答える
2

私の知る限り、標準ライブラリでこれを簡単に行うことはできませんが、Boost の多次元配列をいつでも使用できます。

于 2012-04-05T09:10:39.500 に答える
0

これが役立つかどうかを確認してください (列優先のストレージが必要な場合は、おそらくソース コードを変更する必要があります)。

于 2012-04-05T09:12:29.683 に答える