3

次の 2d ベクトル/マトリックスXとベクトルYがあります。

std::vector<double> Y; 
unsigned int ctr=2;
std::vector<std::vector<double> >X(ctr,Y);

X、つまり Xtrans の転置を作成したいので、以下のように宣言します。

std::vector<std::vector<double> >Xtrans(Y,ctr);

しかし、それは私に次のコンパイルエラーを与えます:

test.cpp:128:58: error: no matching function for call to ‘std::vector<std::vector<double> >::vector(std::vector<double>&, unsigned int&)’
/usr/include/c++/4.5/bits/stl_vector.h:241:7: note: candidates are: std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, std::vector<_Tp, _Alloc> = std::vector<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:227:7: note:                 std::vector<_Tp, _Alloc>::vector(std::vector::size_type, const value_type&, const allocator_type&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, std::vector::size_type = unsigned int, value_type = std::vector<double>, allocator_type = std::allocator<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:215:7: note:                 std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >, allocator_type = std::allocator<std::vector<double> >]
/usr/include/c++/4.5/bits/stl_vector.h:207:7: note:                 std::vector<_Tp, _Alloc>::vector() [with _Tp = std::vector<double>, _Alloc = std::allocator<std::vector<double> >]

Xtrans を正しく宣言するにはどうすればよいですか?

4

4 に答える 4

2

コードの修正について他の人がすでに言ったことに加えて、vector<vector<double> >非常に非効率的であり、あなたが望むものはほとんどない行列表現として使用することについてコメントしたいと思います。私の同僚は、かつてこのスタイルを使用してコードを継承しました。適切なインデックス操作関数を使用してシンプルに変換すると、パフォーマンスが30vector<double>倍向上しました。誘惑に抵抗します。

C++ 用の多数の利用可能な行列ライブラリの 1 つを調べることをお勧めします (たとえば、 eigenuBlas、またはmtl4などがあります。他にも多数あります)。

于 2012-04-30T15:43:29.497 に答える
1

ここには 2 つの問題があると思いstd::vectorます.

std::vector<std::vector<double> >Xtrans(Y,ctr); 

宣言に一致するコンストラクターがないため、コンパイラ エラーが生成されます。

のコンストラクターstd::vectorの 1 つ (つまり、宣言に使用したものX) は、次のように宣言されます。

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

あなたがそれをしたとき、それはうまくいきました-あなたはコンパイラーに、の値が何であれサイズの(ctr, Y)を作成したいと言っていたからです。(あなたの場合は空です-したがって、各エントリが空であるエントリのベクトルを取得します)std::vectorctrYYstd::vector<double>ctrstd::vector<double>

したがって、単純に交換ctrY、転置されることを期待して行うことは、std::vectorここでは機能しません。

2 番目の問題は、値を実際にどのように転置するかです。実際には、X の転置を行い、それらの値を Xtrans にプッシュするアルゴリズムを理解する必要があります。値を転置することは、実際にベクトルを作成することとは異なります。ほとんどの場合、アルゴリズムは次のようなものになります - 構築XTransしてから、「X and insert values intoXTrans」を反復処理します。

于 2012-04-30T15:41:08.063 に答える
0

コードをコンパイルするだけで、次のように宣言できXtransます

std::vector<double> Y;
unsigned int ctr=2;
std::vector<std::vector<double> >X(ctr,Y);
std::vector<double> ctr_vector(2);
std::vector<std::vector<double> >Xtrans(Y.size(),ctr_vector);

ただし、X の転置されたバージョンとして使用するには、Xtrans を設定する必要があります。

于 2012-04-30T15:39:31.360 に答える
0

のコンストラクタ構文を誤解しているようですstd::vector詳しくはこちらをご覧ください

呼び出しには、のコピーの数をstd::vector<std::vector<double> >X(ctr,Y)作成し、それを X に格納する効果があります。したがって、基本的に、はまだ 1 次元のオブジェクトであり、 の各インデックスで別の、 のコピーを取得するだけです。ctrYXXstd::vectorY

したがって、後の構文std::vector<std::vector<double> >Xtrans(Y,ctr)は type のコンストラクターと一致しませんstd::vector。NumPy や Matlab のように 2 次元配列を構築しません。

このリンクも見てみるといいかもしれません。おそらく最良の方法は、エントリをループ内の新しい配列に手動で配置する独自の転置関数を作成することです。

于 2012-04-30T15:40:02.340 に答える