OpenCV意味着差异化

时间:2015-07-01 07:49:28

标签: c++ arrays opencv mean

我有一个基于列(每列是一个特征)的大数组(大约100M),其大小为75000(固定)*样本数

这是数据向量:

std::vector<float> features;

我已使用此代码计算均值:

cv::Mat data(FEATURE_SIZE, features.size()/FEATURE_SIZE, CV_32F, &features[0]);
cv::reduce(data,dataMeans,1,CV_REDUCE_AVG);

FEATURE_SIZE为75000,features是一个包含所有数据的浮点向量。

为了计算平均移位,我使用了这个:

data -= cv::repeat(dataMeans,1,features.size()/FEATURE_SIZE);

我认为尝试使用features数组创建一个大小相同的数组,从而给我一个错误的分配异常。

我只需要将该数组区分开来。有没有办法在没有复制的情况下在同一个内存位置上进行?

1 个答案:

答案 0 :(得分:0)

首先,你弄乱了列和行。 这是一个正确的方法来做你想要的:

#define FEATURES_SIZE 3

int main()
{
    vector<float> features = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

    Mat1f data(features.size() / FEATURES_SIZE, FEATURES_SIZE, &features[0]);
    Mat dataMeans;
    cv::reduce(data, dataMeans, 1, CV_REDUCE_AVG);
    data -= repeat(dataMeans, 1, FEATURES_SIZE);
}

但是,您可能无法在尺寸上使用opencv矩阵。 您可以使用std函数:

// other includes
#include <algorithm>
#include <numeric>
#include <functional>


#define FEATURES_SIZE 3

int main()
{
    vector<float> features = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    for(size_t i = 0; i<features.size(); i+= FEATURES_SIZE)
    {
        float cumsum = accumulate(features.begin() + i, features.begin() + i + FEATURES_SIZE, 0.f);
        float avg = cumsum / FEATURES_SIZE;
        transform(features.begin() + i, features.begin() + i + FEATURES_SIZE, features.begin() + i, bind2nd(std::minus<float>(), avg));  
    }
}

我不知道这是否是“最小份数”最佳解决方案。尝试使用大型阵列并检查它是否有问题。

注意:为简洁起见,我的示例中使用了using namespace std;using namespace cv

希望它有所帮助!