遥感院2015上机参考答案

//题目网上能搜到,这是自己编译的答案,由于没有数据,思路仅供参考

#include "stdafx.h"

#include<fstream>
#include <iostream>
#include <vector>
#include <math.h>
#include <functional>
#include <algorithm>
#include <numeric>
#define num 10000
#define m 100
#define n 100
#define K 3
using namespace std;
struct POINT
{
int index;//聚类序号
int  x;//聚类中心横坐标
int  y;//聚类中心纵坐标
int  pixel;
};
struct cluster
{
int x;
int y;
int pixel;
};
vector<vector<POINT> > fl(vector<POINT>&vec, cluster *pp);
void xjl(vector<vector<POINT> >&vecc, cluster *pp);
int main()
{
/*输入输出文件设置*/
ifstream infile("E://data.txt");
ofstream outfile1("E://cluster_centers.txt");
ofstream outfile2("E://cluster_labels.txt");
if (!infile) { cout << "data.txt open failed" << endl; return 1; }
if (!outfile1) { cout << "cluster_centers.txt open failed" << endl; return 1; }
if (!outfile2) { cout << "cluster_labels.txt open failed" << endl; return 1; }
/*读取数据*/
int i, j;//循环变量
POINT pi; //样本
vector<POINT>vec;//动态数组
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
infile >> pi.pixel;
pi.x = i + 1;
pi.y = j + 1;
vec.push_back(pi);
}
}
//初始化聚类中心
cluster pp[3];//存放当前聚类中心
cluster p[3];//存放旧的聚类中心值
pp[0].x = 10;
pp[0].y = 10;
pp[1].x = 70;
pp[1].y = 30;
pp[2].x = 80;
pp[2].y = 90;
vector<vector<POINT> >vecc(3);//聚类,用于存放最小距离计算后的匹配样本

vecc=fl(vec, pp);//得到聚类后的3个类群
xjl(vecc, pp);//求出新的聚类值
while (fabs(p[0].x == pp[0].x) && fabs(p[0].y == pp[0].y) &&
fabs(p[1].x == pp[1].x) && fabs(p[1].y == pp[1].y) &&
fabs(p[2].x == pp[2].x) && fabs(p[2].y == pp[2].y))
{
for (i = 0; i < K; i++)
{
p[i].x = pp[i].x;
p[i].y = pp[i].y;
p[i].pixel = pp[i].pixel;
}
vecc=fl(vec, pp);//得到聚类后的3个类群
xjl(vecc, pp);//求出新的聚类值
}
for (i = 0; i < K; i++)
{
outfile1 << i + 1 << pp[i].x << pp[i].y << pp[i].pixel << vecc[i].size() << " ";
outfile1 << endl;
}
for (i = 0; i < K; i++)
{
for (j = 0; j < vecc[i].size(); j++)
{
outfile2 << vecc[i][j].index << " ";
}
outfile2 << endl;
}
outfile1.close();
outfile2.close();
infile.close();
return 0;
}
/*类别判定函数,返回聚类后的K个类群*/
vector<vector<POINT> > fl(vector<POINT>&vec,cluster *pp)
{ /*步骤二:循环遍历,计算距离,判定类别*/
int i, j;
vector<vector<POINT> >vecc(3);//存放同类样本
int sq = 0;
vector<double>dis(K);//样本到聚类中心的距离
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
for (int k = 0; k < K; k++)
{
dis[k] = sqrt(pow(vec[i*n + j].x - pp[k].x, 2.0) + pow(vec[i*n + j].y - pp[k].y, 2.0));
}
double mindis = dis[0];
for (int k = 0; k < K; k++)
{
if (mindis > dis[k])
{
mindis = dis[k];
sq = k;
}
}
vec[i*n + j].index = sq + 1;
vecc[sq].push_back(vec[i*n + j]);
}
}
return vecc;
}


/*求出新的聚类中心*/
void xjl(vector<vector<POINT> >&vecc, cluster *pp)
{//步骤三:求出新的聚类中心相关值
int i, j;
int sumx = 0;
int sumy = 0;
int sumpixel = 0;
for (i = 0; i < K; i++)
{
for (j = 0; j < vecc[i].size(); j++)
{
sumx += vecc[i].at(j).x;
sumy += vecc[i].at(j).y;
sumpixel += vecc[i].at(j).pixel;
}
pp[i].x = sumx / vecc[i].size();
pp[i].y =sumy / vecc[i].size();
pp[i].pixel = sumpixel / vecc[i].size();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值