1

私は次のようにそれをしました

Mat temp, rp;    
for (int i = 0; i <= descriptors1.rows - 1; i++)
{
    normalize(descriptors1.row(i), temp);
    rp = normd1.rowRange(i, i+1);
    temp.copyTo(rp);
}

上記のdescriptors1はマットです。

ただし、ループの使用には時間がかかります。これを行うためのより良い方法はありますか?

よろしく。

4

1 に答える 1

1

ループには何の問題もありません。Matlabについて聞いたことがあるかもしれませんが、C++では遅くありません。これが非常に時間に敏感なアプリケーションで使用される場合は、ループを最適化してi <= descriptors1.rows - 1、各反復でチェックを削除できます。使用する必要もありません。直接にtemp渡すことで時間を節約し、1行で実行できnormd1.rowRangeます。normalize

編集:このメソッドnormalize(A.row(i), _OutputArray(B.ptr(i), B.cols))、またはのテンプレートバージョンを使用できます_OutputArray。各反復でループを記述した方法では descriptors1.rows - 1、コンパイラがrows定数ではなく、ループ内の関数がループを変更しないことを理解していない可能性が高いため、評価する必要があります。だから私はそれを次のようなものに変更します:

for (i = descriptors1.rows - 1; i >= 0; i--)

ただし、コンパイラによって生成されたコードをチェックして、最適化されていることを確認する必要があります。また、ループの展開も検討する必要があります。これが本当にコードのボトルネックである場合、Googleはループの最適化に関する多くの資料を見つけることができます。

于 2012-05-21T09:17:44.377 に答える