# 像元纯度指数算法C++实现

#include "stdafx.h"
# include <iostream>
#include <math.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
//行数
const int n=10000;
//散点坐标
double x[n];
double y[n];
double xSum=0;
double ySum=0;

//随机生成坐标点
for (int i=0;i<n;i++)
{
x[i]=rand()%n;
y[i]=rand()%n;
}

//投影点的平均值
double xAve;
double yAve;
//像元纯度指数
double PPI[n];

for (int i=0;i<n;i++)
{
PPI[i]=0;
}
//基向量的不同角度
int angle[6]={90,30,60,0,120,150};
//基向量斜率
double slope;

for (int k=0;k<6;k++)
{
xSum=0;
ySum=0;
cout<<angle[k]<<" ";
//垂直向量
if (angle[k]==90)
{
xAve=0;
//求Y的平均值
double yTempSum=0;
for (int i=0;i<n;i++)
{
yTempSum+=y[i];
}
yAve=yTempSum/n;
}
//水平向量
else if (angle[k]==0)
{
yAve=0;
//求x平均值
double xTempSum=0;
for (int i=0;i<n;i++)
{
xTempSum+=x[i];
}
xAve=xTempSum/n;
}
else
{
double xTempSum=0;
double yTempSum=0;
//求投影坐标平均值
slope=tan((double)angle[k]*3.1415926/180);
//计算每个点投影坐标，并加和
for (int i=0;i<n;i++)
{
xTempSum+=(x[i]+slope*y[i])/(slope*slope+1);
yTempSum+=slope*(x[i]+slope*y[i])/(slope*slope+1);
}
xAve=xTempSum/n;
yAve=yTempSum/n;
}
cout<<xAve<<" "<<yAve<<endl;

//计算PPI总和
for (int i=0;i<n;i++)
{
if (angle[k]==90)
{
PPI[i]+=abs(y[i]-yAve);
}
else if (angle[k]==0)
{
PPI[i]+=abs(x[i]-xAve);
}
else
{
slope=tan((double)angle[k]*3.1415926/180);
//点在基向量上的投影坐标
double xProj=(x[i]+slope*y[i])/(slope*slope+1);
double yProj=slope*(x[i]+slope*y[i])/(slope*slope+1);
PPI[i]+=sqrt((xProj-xAve)*(xProj-xAve)+((yProj-yAve))*(yProj-yAve));
}
}
}
//对PPI进行冒泡排序：递增
for (int i=0;i<n;i++)
{
for (int j=0;j<n-i-1;j++)
{
double currLenj=PPI[j];
double currlenj1=PPI[j+1];

if (currLenj>currlenj1)
{
//交换顺序x
int tempX=x[j];
x[j]=x[j+1];
x[j+1]=tempX;

//交换顺序y
int tempY=y[j];
y[j]=y[j+1];
y[j+1]=tempY;

//交换每个PPI顺序
double tempLen=PPI[j];
PPI[j]=PPI[j+1];
PPI[j+1]=tempLen;

}
}
}

int m=n*0.85;

for (int j=0;j<m;j++)
{
double length=PPI[j]/100000;
cout<<length<<" "<<x[j]<<" "<<y[j]<<endl;
}
}

#include "stdafx.h"
# include <iostream>
using namespace std;
#include <fstream>

int _tmain(int argc, _TCHAR* argv[])
{
//行数
const int n=10000;

double a[n][2];
double xSum=0;
double ySum=0;

for (int i=0;i<n;i++)
{
a[i][0]=rand()%n;
a[i][1]=rand()%n;
cout<<a[i][0]<<" "<<a[i][1]<<endl;
xSum+=a[i][0];
ySum+=a[i][1];
}

cout<<xSum<<" "<<ySum<<endl;
double xAve=xSum/n;
double yAve=ySum/n;
cout<<xAve<<" "<<yAve<<endl;
//计算距离
double maxLen=0;
int maxIndex=0;
//排序后位置
int location[n];

//冒泡排序
for (int i=0;i<n;i++)
{
for (int j=0;j<n-i-1;j++)
{
double currLenj=sqrt((a[j][0]-xAve)*(a[j][0]-xAve)+(a[j][1]-yAve)*(a[j][1]-yAve));
double currlenj1=sqrt((a[j+1][0]-xAve)*(a[j+1][0]-xAve)+(a[j+1][1]-yAve)*(a[j+1][1]-yAve));

if (currLenj>currlenj1)
{
//交换顺序x
int tempX=a[j][0];
a[j][0]=a[j+1][0];
a[j+1][0]=tempX;

//交换顺序y
int tempY=a[j][1];
a[j][1]=a[j+1][1];
a[j+1][1]=tempY;
}
}
location[i]=maxIndex;
}
int m=n*0.85;
for (int j=0;j<m;j++)
{
double length=(a[j][0]-xAve)*(a[j][0]-xAve)+(a[j][1]-yAve)*(a[j][1]-yAve);
cout<<length<<" "<<a[j][0]<<" "<<a[j][1]<<endl;
}

}

• 本文已收录于以下专栏：

## 机器学习实战之决策树（1）---ID3算法与信息熵，基尼不纯度

（1）关于ID3算法百度文库有一篇十分详细的文章，介绍看一个例子，给出了具体的计算过程。 文章链接：http://wenku.baidu.com/view/7933c2f6f61fb7360b4...

## 机器学习实战之决策树（1）---ID3算法与信息熵，基尼不纯度

• chchlh
• 2014年12月02日 11:26
• 2310

## 二次指数平滑算法Python实现

import pandas as pd import numpy as np import matplotlib.pyplot as plt import pymysql # Read data fr...

## PhotoShop算法实现-- Gamma校正（指数变换）（五）

PhotoShop Gamma校正（指数变换）（五） kezunhai@gmail.com http://blog.csdn.net/kezunhai           Gamma曲线是一种特殊...

## 一种时效性约束的二进制指数退避算法

• 2014年05月23日 22:04
• 461KB
• 下载

举报原因： 您举报文章：像元纯度指数算法C++实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)