我有一个基于列(每列是一个特征)的大数组(大约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
数组创建一个大小相同的数组,从而给我一个错误的分配异常。
我只需要将该数组区分开来。有没有办法在没有复制的情况下在同一个内存位置上进行?
答案 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
。
希望它有所帮助!