前言
最近对卫星数据进行随机取样检核,根据模型符合度和各种DOP判断数据的正确性,数据随机取样的方式有很多:比如按数据的残差大小分子集进行检核(先检核正确率高的数据);按数据的系统分子集进行检核;按数据的频点分子集进行检核;全部数据一起进行检核;数据分半检核,即每次取一半的数据添加进去,检测有问题的话,再从刚才的子集中一个个添加进去,检验是哪个数据出问题。
1、随机取样代码
下面的代码是从10个数据中随机抽取5个数据,总共抽取10次。
#include <iostream>
#include <cstdlib>
#include <ctime>
void RandTest(int *randinex , int epochNum,int lengthdata)
{
int *randfalg= (int *)malloc(lengthdata * sizeof(int));
memset(randfalg,0x0,sizeof(int)*lengthdata);
int Num = 0, j=0, t = 0;
for (j = 0; j < epochNum; j++)
{
t = rand() % lengthdata;//随机生成0-(lengthdata-1)的数据
if (randfalg[t] != 1)//确保同样的随机数,只去一次
{
randfalg[t] = 1;
randinex[Num] = t;
printf(" %2d ", t);
Num++;
if (Num == epochNum) continue;
}
else
{
j--;
}
}
printf(" \n");
free(randfalg);
}
#define kEPOCHNUM 5
#define kSAMPLENUM 10
int main(int argc, const char * argv[])
{
int k = 0, lengthdata = 0;
int gdata[10] = {11,3,5,6,7,8,23,1,-1,-2};//需要取样的数据
lengthdata = sizeof(gdata)/sizeof(int);//计算数据的长度
int randindex[kSAMPLENUM][kEPOCHNUM] = {0};//下标保存
srand((unsigned)time(NULL));
for (k = 0; k < kSAMPLENUM; k++)//取样次数 kSAMPLENUM
{
//每次从lengthdata个数据中取出kEPOCHNUM个数据对应的下标
printf("取样次数: %2d gdata对应的下标",k+1 );
RandTest(randindex[k], kEPOCHNUM, lengthdata);
}
return 0;
}
取样结果图: