⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cldfit.m

📁 matlab编写的正态云发生器与云拟合程序
💻 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 + -