首页 / 资讯中心 / 文章详情

C++代码实现MATLAB中的clusterdata函数功能

C++代码实现MATLAB中的clusterdata函数功能 ★ FEATURED ARTICLE
#includeiostream#includevector#includecmath#includealgorithm#includemapusingnamespacestd;// ---------- 并查集 ----------structUnionFind{vectorintparent,rank_;explicitUnionFind(intn):parent(n),rank_(n,0){for(inti0;in;i)parent[i]i;}intfind(intx){while(parent[x]!x){parent[x]parent[parent[x]];// 路径压缩xparent[x];}returnx;}boolunite(intx,inty){intrxfind(x),ryfind(y);if(rxry)returnfalse;if(rank_[rx]rank_[ry])swap(rx,ry);parent[ry]rx;if(rank_[rx]rank_[ry])rank_[rx];returntrue;}};// ---------- clusterdata 核心 ----------// X: 数据矩阵 (n 行 d 列)maxclust: 期望的最大簇数// 返回长度为 n 的标签向量1-basedvectorintclusterdata(constvectorvectordoubleX,intmaxclust){intn(int)X.size();if(n0)return{};if(maxclustn){vectorintlabels(n);for(inti0;in;i)labels[i]i1;returnlabels;}// 1) 计算所有成对欧氏距离等价于 pdiststructEdge{doubled;inti,j;};vectorEdgeedges;edges.reserve(n*(n-1)/2);for(inti0;in;i)for(intji1;jn;j){doubles0.0;for(size_t k0;kX[i].size();k){doublediffX[i][k]-X[j][k];sdiff*diff;}edges.push_back({sqrt(s),i,j});}sort(edges.begin(),edges.end(),[](constEdgea,constEdgeb){returna.db.d;});// 2) 单链接层次聚类 按边长递增执行 KruskalUnionFinduf(n);intcomponentsn;for(constautoe:edges){if(componentsmaxclust)break;if(uf.unite(e.i,e.j))--components;}// 3) 将每个点映射为 1..maxclust 的簇标签vectorintlabels(n);mapint,introot2label;intnext_label1;for(inti0;in;i){intruf.find(i);autoitroot2label.find(r);if(itroot2label.end()){root2label[r]next_label;labels[i]next_label;next_label;}else{labels[i]it-second;}}returnlabels;}// ---------- 测试 ----------intmain(){vectorvectordoubleX{{1.0,1.0},{1.5,1.5},{5.0,5.0},{5.5,5.5},{10.0,1.0},{10.5,1.5}};intmaxclust2;vectorintlabelsclusterdata(X,maxclust);coutCluster labels (1-based):endl;for(size_t i0;ilabels.size();i){if(i)cout ;coutlabels[i];}coutendl;return0;}
阅读完成 · 觉得有帮助?
咨询建站