📄 maingui.m
字号:
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in btnsave.
function btnsave_Callback(hObject, eventdata, handles)
% hObject handle to btnsave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
result = get(handles.btnrun,'UserData');
ButtonName=questdlg('保存结果为何种形式?', ...
'分割结果保存', ...
'JPG图片','MAT文件','MAT文件');
switch ButtonName,
case 'MAT文件',
[fname,path] = uiputfile('*.mat','保存为');
if path==0 % 取消文件保存操作
return;
end
save([path fname],'result','-v6');
case 'JPG图片',
directoryname = uigetdir;
if directoryname == 0 % canceled
return;
end
pwdir = pwd; % 获得当前目录
cd(directoryname); % 转到选定目录
fnametmp = datestr(now,31);
fnametmp = strrep(fnametmp,':','-'); % 文件名中不能够有:号
fnametmp = strrep(fnametmp,' ','_');
for k = 1:length(result)-1
fnamestr = [fnametmp 'Kind',num2str(k),'.jpg'];
fcell ={fnamestr};
tmpM = result{k};
imwrite(tmpM,fcell{1},'jpg');
end
fnamestr = [fnametmp,'Whole.jpg'];
fcell ={fnamestr};
tmpM = result{end};
imwrite(tmpM,fcell{1},'jpg');
cd(pwdir);
end % switch
% --- Executes on button press in btnquit.
function btnquit_Callback(hObject, eventdata, handles)
% hObject handle to btnquit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% selection = questdlg(['退出 ' get(handles.MainFig,'Name') '?'],...
% ['退出 ...'],...
% '是','否','是');
% if strcmp(selection,'否')
% return;
% end
htimer = timerfind('tag','showtime');
stop(htimer);
delete(htimer);
delete(handles.MainFig);
% --- Executes on selection change in hmenu.
function hmenu_Callback(hObject, eventdata, handles)
% hObject handle to hmenu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns hmenu contents as cell array
% contents{get(hObject,'Value')} returns selected item from hmenu
val = get(hObject,'Value');
set(hObject,'UserData',val);
if val == 1
set(handles.hbtxt,'Visible','off');
set(handles.hedit_heb,'Visible','off');
elseif val == 2
set(handles.hbtxt,'Visible','on');
set(handles.hedit_heb,'Visible','on');
else
msgbox('不可能出现的吧');
end
% --- Executes on button press in chkbx.
function chkbx_Callback(hObject, eventdata, handles)
% hObject handle to chkbx (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of chkbx
val = get(hObject,'Value');
set(hObject,'UserData',val);
if val==0
set(handles.hedit_info,'string',{' ';'不输出信息';' '});
else
set(handles.hedit_info,'string',{' ';'尚未进行分割聚类';' '});
end
% --------------------------------------------------------------------
function hinfosave_Callback(hObject, eventdata, handles)
% hObject handle to hinfosave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
infostr = get(handles.hedit_info,'string');
[fname,path] = uiputfile('*.txt','导出为');
if path==0 % 取消文件保存操作
return;
end
fid = fopen([path fname],'w');
if fid == -1 % 不能够打开文件
msgbox({'不能打开文件' fname},'文件保存出错','error');
return;
end
% 保存信息
fprintf(fid,'\r\n=====%s=====\r\n\r\n',datestr(now,31));
for k = 1:size(infostr,1)
fprintf(fid,'%s',infostr(k,:));
fprintf(fid,'\r\n');
end
fclose(fid);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FCM 需要的子函数
% 子函数
function U = initfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
% cluster_n ---- 聚类中心个数
% data_n ---- 样本点数
% 输出:
% U ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);
% 子函数
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚类时迭代的一步
% 输入:
% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
% U ---- 隶属度矩阵
% cluster_n ---- 标量,表示聚合中心数目,即类别数
% expo ---- 隶属度矩阵U的指数
% 输出:
% U_new ---- 迭代计算出的新的隶属度矩阵
% center ---- 迭代计算出的新的聚类中心
% obj_fcn ---- 目标函数值
mf = U.^expo; % 隶属度矩阵进行指数运算结果
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心(5.4)式
dist = distfcm(center, data); % 计算距离矩阵
obj_fcn = sum(sum((dist.^2).*mf)); % 计算目标函数值 (5.1)式
tmp = dist.^(-2/(expo-1));
U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 计算新的隶属度矩阵 (5.3)式
% 子函数
function out = distfcm(center, data)
% 计算样本点距离聚类中心的距离
% 输入:
% center ---- 聚类中心
% data ---- 样本点
% 输出:
% out ---- 距离
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 对每一个聚类中心
% 每一次循环求得所有样本点到一个聚类中心的距离
out(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% KFCM 需要的子函数
% 子函数
function U = initkfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
% cluster_n ---- 聚类中心个数
% data_n ---- 样本点数
% 输出:
% U ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);
% 子函数
function [U_new,center_new,obj_fcn] = stepkfcm(data,U,center,expo,kernel_b)
% 模糊C均值聚类时迭代的一步
% 输入:
% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
% U ---- 隶属度矩阵
% center ---- 聚类中心
% expo ---- 隶属度矩阵U的指数
% kernel_b ---- 高斯核函数的参数
% 输出:
% U_new ---- 迭代计算出的新的隶属度矩阵
% center_new ---- 迭代计算出的新的聚类中心
% obj_fcn ---- 目标函数值
feature_n = size(data,2); % 特征维数
cluster_n = size(center,1); % 聚类个数
mf = U.^expo; % 隶属度矩阵进行指数运算(c行n列)
% 计算新的聚类中心;根据(5.15)式
KernelMat = gaussKernel(center,data,kernel_b); % 计算高斯核矩阵(c行n列)
num = mf.*KernelMat * data; % 式(5.15)的分子(c行p列,p为特征维数)
den = sum(mf.*KernelMat,2); % 式子(5.15)的分子,(c行,1列,尚未扩展)
center_new = num./(den*ones(1,feature_n)); % 计算新的聚类中心(c行p列,c个中心)
% 计算新的隶属度矩阵;根据(5.14)式子
kdist = distkfcm(center_new, data, kernel_b); % 计算距离矩阵
obj_fcn = sum(sum((kdist.^2).*mf)); % 计算目标函数值 (5.11)式
tmp = kdist.^(-1/(expo-1));
U_new = tmp./(ones(cluster_n, 1)*sum(tmp));
% 子函数
function out = distkfcm(center, data, kernel_b)
% 计算样本点距离聚类中心的距离
% 输入:
% center ---- 聚类中心
% data ---- 样本点
% 输出:
% out ---- 距离
cluster_n = size(center, 1);
data_n = size(data, 1);
out = zeros(cluster_n, data_n);
for i = 1:cluster_n % 对每个聚类中心
vi = center(i,:);
out(i,:) = 2-2*gaussKernel(vi,data,kernel_b);
end
% 子函数
function out = gaussKernel(center,data,kernel_b)
% 高斯核函数计算
% 输入:
% center ---- 模糊聚类中心
% data ---- 样本数据点
% kernel_b ---- 高斯核参数
% 输出:
% out ---- 高斯核计算结果
if nargin == 2
kernel_b = 150;
end
dist = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 对每一个聚类中心
% 每一次循环求得所有样本点到一个聚类中心的距离
dist(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
out = exp(-dist.^2/kernel_b^2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -