2012-05-07 7 views
0

3行4列の行列の数が不定であると仮定します。 (または他の固定m行n列の行列のシーケンス)。私の最初の考えは、これらの行列をstd::vectorに格納することです。各行列はそれ自体std::vector<std::vector<double> >です。 std::vector::reserve()を使用して、これらの行列の数値、たとえばxにスペースを事前に割り当てることはできますか?私が2つの次元を知っているので、私はこれらのブロックのサイズをx倍にすることができなければなりません。"ブロック"を保持するC++ 3Dベクトル

私は1D std::vectorでこのオブジェクトを実装する方法を知っているが、私はより良いstd::vectorクラスを使用する方法を学習するよりも、他に理由がない場合は、3D std::vectorでそれを行う方法を知っているように思います。

+0

「保存」というようなものはありません。 –

+0

あなたは 'reserve()'を意味する、 'preserve'はKerrek SBのように存在しません – EdChum

+0

申し訳ありません、はい、私は" preserve "ではなく" reserve "を意味しました。 :) – synaptik

答えて

0

より良いアプローチは、クラスインターフェイスを提供し、行列全体に対して1つの線形メモリブロックを使用することです。次に、適切なサイズ(サイズがサイズの一部である場合)の内部配列から、さまざまな方法でそのインターフェイスを実装することができます。またはインデックス付け(pos = row*cols + col)を提供することによってstd::vector<int>を1つ作成します。

std::vector< std::vector<int> >のアプローチでは、外側のベクトルは内側のベクトルを格納するためにメモリを割り当て、それらのそれぞれはそれ自身の要素を保持するためにメモリを割り当てます。ある

int **array = new int*[ N ]; 
for (int i = 0; i < N; ++i) 
    array[i] = new int[ M ]; 

[ 0 ] -------> [ 0, 1, 2, ... ] 
[---] 
[ 1 ] -------> [ 0, 1, 2, ... ] 
[ . ] 
[ . ] 

またはメモリの基本的にN + 1つの別個のブロックを生のポインタを使用して、それは、メモリレイアウトに類似しています。

1

ベクトルのベクトルとしての行列の格納は、おそらくかなり非効率的ですが、そうする必要がある場合は、移動してください。う、あなたはm * n要素と進歩でアクセスを単一のベクトルを持つことの方がよいかもしれませんあなたの基底型の

typedef std::vector<std::vector<int>> matrix_type; 

std::vector<matrix_type> collection; 

collection.reserve(100); // set capacity for 100 "matrices" 

// make 10 4x3-matrices; `collection` won't reallocate 
collection.resize(10, matrix_type(4, std::vector<int>(3))); 

(i、j)は番目の要素、すなわち:スペースを確保することは、常に同じですポジションはi * n + jです。それぞれのベクター自体は動的コンテナであり、おそらく多くの動的割り当てをその場で行う必要はありません。

同じ静脈で

、上記reserveコールは、おそらくそれが唯一の内側のベクトルの簿記データ(ベクトルあたり通常三つの言葉、すなわち300ワード)のためのメモリを確保してあなたは、何を考えて行っていない、とない用実際のデータそのような意味で、std::array<int, m*n>をあなたのマトリックスタイプと見なして(そしてストライドでアクセスすることも)好きかもしれません。今ではが実際の行列の前のスペースのために実際にスペースを予約しますが、mnはコンパイル時の定数でなければなりません。

+0

ありがとう。これは非常に役に立ちます。私は行列型として 'std :: array'を使う考え方に非常に似ています。 – synaptik

関連する問題