2017-04-04 2 views
0
std::vector<cv::Mat1f> mat = std::vector<cv::Mat1f>(10,cv::Mat1f::zeros(1,10)); 
mat[0]+=1; 
for(size_t i=0;i<mat.size();i++) 
    std::cout<<mat[i]<<std::endl; 

をリンクし、それが印刷されています。ベクトル::マットは、それらの間

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

私はこの問題を回避するにはどうすればよいですか?ベクトルの初期化がインラインであることは非常に重要です。

答えて

0

これはできません。 vectorコンストラクタでは、コピーコンストラクタMatが使用されます。このコンストラクタは、ヘッダのみをコピーし、データはコピーしません。あなたは明示的に毎回何とかclone()を使用するか、新しい行列を作成する必要があります。例えば:

std::vector<cv::Mat1f> mat(10); 
for (size_t i = 0; i < mat.size(); i++) { 
    mat[i] = cv::Mat1f(1, 10, 0.f); 
} 

か:

cv::Mat1f m = cv::Mat1f(1, 10, 0.f); 
std::vector<cv::Mat1f> mat(10); 
for (size_t i = 0; i < mat.size(); i++) { 
    mat[i] = m.clone(); 
} 

か:

std::vector<cv::Mat1f> mat(10); 
std::generate(mat.begin(), mat.end(), []() {return cv::Mat1f(1, 10, 0.f); }); 

か:

cv::Mat1f m = cv::Mat1f(1, 10, 0.f); 
std::vector<cv::Mat1f> mat(10); 
std::generate(mat.begin(), mat.end(), [&m]() {return m.clone(); }); 
+0

あなたの答えをありがとう、これは痛みです。行単位のイテレータが存在するか?そうでない場合は、どうすれば実装できますか? – justHelloWorld

+0

「行単位」イテレータとはどういう意味ですか? – Miki

+0

私はそれについて別の質問を開くつもりです、私はそれが私にとって良い行動ではないと思う:) – justHelloWorld

関連する問題