📄 cldfit.m
字号:
function cld = cldfit(data,l,r)
% % 函数名:cldfit,云拟合
% % 功能 :对极值对应位置进行云拟合,采用的是云模型的期望曲线
% % 参数 :data为直方图数据,大小3*256,第一行为频率值,第二行为像素值,第三行
% % 极值情况
% % %lm为所选择极大值,大小2*1,第一行为极大值,第二行为像素值%
% % l,r为左右的范围,像素值
% % 返回值:cld为云模型,包含三个参数(Ex;En;He)
% % Author: aoms, Oct,2008
if(r-l<2)
cld = [0;0;0];
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 预处理:将直方图数据转换为相应的样本点数据,从而进行不确定逆向云变换
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dSegment = data(1,l:1:r);
N = sum(data(1,l:1:r));%%计算出所有的样本的个数
drp = []; %%将直方图数据转换为N个云滴构成的数组数据
for i=l:1:r
drp = [drp i*ones(1,data(1,i))];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 根据数据初步由无确定度信息的逆向云算法估计出Ex和En,
%% He暂时设置为0.01,因为He的信息暂时没有用到
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cld = [0;0;0];
center = (l+r)/2;
Ex = center;
centrMom1 = sum(abs(drp-Ex))/N; %%一阶样本中心矩
% % S2 = var(data(1,:)); %%样本方差
En = sqrt(pi/2)*centrMom1;
% % He = sqrt(abs(S2 - En^2));
He = 0.01;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% (1) 对初步求的En进行进一步微调,首先求得期望曲线及其与实际直方图之间的误差
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = l:1:r;
y = exp(-((x-Ex).^2)./(2*En^2));
dSegment_1 = dSegment/max(dSegment); %%将直方图归一化,得dSegment_1
err = y - dSegment_1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% (2) 求取误差的左右侧最大值,err_maxl,err_maxr分别表示左右侧最大误差
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%获取左右两边误差序列
err_lseg = err(1:(r-l+2)/2);
err_rseg = err(((r-l+2)/2):(r-l+1));
max_l = max(err_lseg);min_l = min(err_lseg);
max_r = max(err_rseg);min_r = min(err_rseg);
if( abs(min_l) > abs(max_l) )
err_maxl = min_l;
else
err_maxl = max_l;
end
if( abs(min_r) > abs(max_r) )
err_maxr = min_r;
else
err_maxr = max_r;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% (3) 分情况进行具体的微调
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(err_maxl<0 & err_maxr < 0 )
En = En+0.01;
elseif(err_maxl > 0 & err_maxr > 0)
En = En-0.01;
elseif(err_maxl < -exp(1) & err_maxr >exp(1))
En = En-0.01;
elseif(err_maxr < -exp(1) & err_maxl >exp(1))
En = En-0.01;
end
cld = [Ex;En;He];
end
clear dSegment;clear N;clear center;
clear centMom1;clear x;clear y;
clear err;clear err_lseg;clear err_rseg;
clear max_l;clear max_r;clear min_l;clear min_r;
clear err_maxl;clear err_maxr;clear t;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -