12

すべての列の要素の合計を個別に計算する必要があります。

今私は使用しています:

行列cross_corrを合計する必要があります。

Mat cross_corr_summed;
for (int i=0;i<cross_corr.cols;i++)                                                     
    {
        double column_sum=0;
        for (int k=0;k<cross_corr.rows;k++)
        {
            column_sum +=cross_corr.at<float>(k,i);             
        }
        cross_corr_summed.push_back(column_sum);
    }

問題は、私のプログラムの実行にかなり長い時間がかかることです。これは、これを引き起こす疑いのある部分の1つです。より高速な実装の可能性についてアドバイスできますか?

ありがとう!!!

4

3 に答える 3

39

cv::reduceが必要です:

cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S);
于 2012-10-11T07:03:40.533 に答える
2

データが連続的で単一チャネルであることがわかっている場合は、行列データに直接アクセスできます。

int width = cross_corr.cols;
float* data = (float*)cross_corr.data;
Mat cross_corr_summed;
for (int i=0;i<cross_corr.cols;i++)
{
    double column_sum=0;
    for (int k=0;k<cross_corr.rows;k++)
    {
        column_sum += data[i + k*width];
    }
    cross_corr_summed.push_back(column_sum);
}

を使用するよりも高速になります.at_<float>().at()一般に、直接アクセスよりも遅いため、可能な限り使用を避けています。

また、cv::reduce()(Andrey による提案) ははるかに読みやすいですが、場合によっては実装よりも遅いことがわかりました。

于 2012-10-11T18:01:41.973 に答える