2017-01-09 9 views
0

私はCにMATLABコードからプログラムを翻訳に取り組んでいます++私はLinux上で(gccのバージョン4.9.2)をOpenCVのLIBSを使用する必要がどこC++ - ベクトル<class>とstd :: bad_alloc

だから私は、変換しようとしていますMathWorks社のMATLABのコード行:

repeatedMat = repmat(originalMat,[1 1 k]); 

と私が書いた最後のコードはこれです:

void repeat(cv::Mat img, std::vector <cv::Mat> &output, uint32_t nx, uint32_t ny, uint32_t z) 
{ 
    cv::Mat tmpMat = cv::repeat(img, nx, ny); 
    output = std::vector <Mat> (z); 

    for (uint32_t i = 0; i < output.size(); i++) 
     output.insert(output.end(), tmpMat); 
} 

問題は、私はいつもSTDに実行することです:: bad_allocエラー

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 
Aborted 

がこれを行うには良い(と作業)方法はあります..私は理由を正確に知りませんが、私はいくつかのメモリリークを考えるのですか?

+2

すべてのコードが 'ベクトル出力(Z、IMG)に縮小しなければならない。それに加えて' – rahnema1

+1

、あなたがvector' 'の最後に要素を追加したい場合は、あなたが使用する必要があります' push_back'メソッドを呼び出します。 –

+1

ループが反復されるたびに、 'output'ベクトルが大きくなるので、プログラムがメモリ不足になるまでループ* never *は終わりに達します。 – Gonmator

答えて

2

ループの条件はすべての反復で評価されるため、ベクトルの最後に新しい要素を追加すると1だけ増加するので、次の反復ではカウンタiは到達しません。

for (uint32_t i = 0; i < z; i++) 
    output.insert(output.end(), tmpMat); 

しかし、rahnema1がコメントに述べたように、あなたはそれをする必要はありません。また

output = std::vector <Mat> (z, tmpMat); 

あなたは、「C++ 11」のようにあなたの質問をラベル付けしているので、別の追加提案させて頂いて、:あなたはそれらをコピーすることなく、同じ要素のzコピーを持つベクトルを作成することができる値でベクトルを返しますコンパイラーはコピーを回避します。

std::vector <cv::Mat> repeat(cv::Mat img, uint32_t nx, uint32_t ny, uint32_t z) 
{ 
    return std::vector<cv::Mat>(z, cv::repeat(img, nx, ny)); 
} 
関連する問題