参考:解释hist(y,x)的返回值的含义https://www.ilovematlab.cn/thread-297325-1-1.html
先来一份matlab代码
解析如下:x为一个向量,向量个数为3,于是y被分成了3份,3个容器的间隔分别为 **(-Inf, ( x(1)+x(2) ) / 2 ] , **
( x(1)+x(2)/2, (x(2)+x(3))/ 2 ], ( (x(2)+x(3) )/2, Inf),也就是 **(-lnf,2.5],(2.5, 3.5] ,(3.5,lnf). **
y中元素数值落在这三个区间的个数分别为2,1,0个
同理,落在这三个区间的个数为4,2,0个
既然原理已经明白,那么开始写成C语言吧
#include <stdio.h>
#include <stdlib.h>
int *hist_num;
//float *hist_mean ;
void hist(float* Y_in,int Yin_len,float* X_in,int Xin_len)
{
int i,j;
hist_num = (int*)malloc(sizeof(int));
//hist_mean = (float*)malloc(sizeof(float));
for(j = 0; j< Xin_len;j++)
{
hist_num = (int*)realloc(hist_num,sizeof(int)*(j+1) );
//hist_mean = (float*)realloc(hist_mean,sizeof(float)*(j+1) );
hist_num[j] = 0; //初始化
for(i = 0; i< Yin_len;i++)
{
if(j == 0) //(-lnf, (X[0]+X[1])/2]
{
if( Y_in[i] <= (X_in[j] + X_in[j+1])/2)
hist_num[j] = hist_num[j] +1;
}
else if(j == (Xin_len - 1))//( (X[j-1]+X[j])/2, lnf)
{
if( (X_in[j-1]+X_in[j])/2 < Y_in[i] )
hist_num[j] = hist_num[j] +1;
}
else //( ],( ].....( ]------((X[j-1]+X[j])/2 ,(X[j]+X[j+1])/2]
{
if( ( (X_in[j-1]+X_in[j])/2 < Y_in[i] ) && ( Y_in[i] <= (X_in[j] + X_in[j+1])/2 ) )
hist_num[j] = hist_num[j] +1;
}
}
}
}
int main(void)
{
float aa[] = {0.1 ,1.2 ,2.1 ,2.5, 2.6 ,3.5};
float Xin[] = {2.0,3.0,4};
int len;
int i;
int aa_len = sizeof(aa)/sizeof(float);
int Xin_len = sizeof(Xin)/sizeof(float);
hist(aa,aa_len,Xin,Xin_len);
printf("hist_num = ");
for(i = 0; i<Xin_len;i++)
{
printf(" %d ",hist_num[i]);
}
printf("\n");
printf("Xout = ");
for(i = 0; i<Xin_len;i++)
{
printf(" %f ",Xin[i]);
}
printf("\n");
free(hist_num);
//free(hist_mean);
return 0;
}
运行结果如下