我正在嘗試做「dat」中數據點的k最近鄰居(KNN),所以我的第一步是構建每個點和所有其他點之間的距離矩陣點,然後爲每個點找到K最近的鄰居。下面的代碼在沒有openmp的情況下可以很好地工作。但是,當我使用openmp時,會出現分段錯誤。我認爲這個錯誤與我如何更新包含k個最小元素索引的最小值有關。我認爲可能是我需要使用矢量最小的「縮小」,但我不知道如何使用它,或者它是對還是錯,所以對如何克服這種分割錯誤的幫助真的很感激。使用openmp和分段錯誤的並行K最近鄰居
vector<vector<double> > dist(dat.size(), vector<double>(dat.size()));
size_t p,j;
ptrdiff_t i;
vector<double> sumKnn;
vector<vector<int > > smallest(dat.size(), vector<int>(k));
#pragma omp parallel for private(p,j,i) default(shared)
for(p=0;p<dat.size();++p)
{
int mycont=0;
for (j = p+1; j < dat.size(); ++j)
{
double ecl = 0.0;
for (i = 0; i < c; ++i)
{
ecl += (dat[p][i] - dat[j][i]) * (dat[p][i] - dat[j][i]);
}
ecl = sqrt(ecl);
dist[p][j] = ecl;
dist[j][p] = ecl;
int index=0;
if(mycont<k && j!=p)
{
smallest[p][j-p-1]=j;
mycont++;
}
else
{
double max=0.0;
int index=0;
for(int i=0;i<smallest[p].size();i++)
{
if(max < dist[p][smallest[p][i]])
{
index=i;
max=dist[p][smallest[p][i]];
}
}
if(max>dist[p][j])
{
smallest[p].erase(smallest[p].begin()+index);
smallest[p].push_back(j);
}
}
}
double sum=0.0;
for(int r=0;r<k;r++)
sum+= dist[p][smallest[p][r]];
sumKnn.push_back(sum);
}
「k最近鄰KNN」和普通KNN有什麼區別? – 2012-03-03 14:03:18
這是相同的,只是我想使它平行 – DOSMarter 2012-03-03 14:21:34
你有沒有考慮過使用kd-tree而不是對算法進行parellizing? – 2012-03-03 16:34:43