前言
製作gui界面,根據輸入兩個整數,畫直方圖。直方圖的直方數和隨機數的個數由界面輸入;隨機數的類型請用radiobutton控制,至少給出三種隨機數組合。
入門系列一從界面到功能具體實現詳細下戳
Matlab GUI入門-文件顯示界面製作
實操
1.step 1 構建圖形的初始頁面,顏色、字體大小可以雙擊 打開屬性頁面設置 自己選擇
2.功能部分。
對功能進行分析。
(1)輸入參數後,點擊確定之後,直方分佈圖繪製在畫布上
(2)輸入參數後,點擊取消後重置參數。
大致點擊“確定” 按鈕,右鍵進入回調(查看回調-callback),搭建初步實現框架,再去補其他具體模塊實現。
還是同上面思路一樣,通過捕獲異常 輸出 參數無效值的設置
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%設置全局變量來記錄是否顯示過繪圖
global draw
draw=0
try
%獲得直方數
num=get(handles.edit1,'string')
num=str2num(num)
%獲得隨機數個數
rand_num=get(handles.edit2,'string')
rand_num=str2num(rand_num)
%這裏的設置是因爲一開始運行的時候,單選默認是“均勻分佈”,至於你的“均勻分佈”的Tag是什麼要具體修改
try
a=handles.str_button %如果點擊了按鈕組的選項,這裏不會報錯 因此可以直接獲得
catch exception
%報錯了是因爲沒有點擊按鈕選項,按照初始的默認選擇。報錯的原因要具體看我下面按鈕組的設置模塊部分是怎麼寫的。因爲,我沒有給按鈕們設置value
a='radiobutton1'%查看對應的tag ,這裏進行修改
end
%判斷單選按鈕,對應隨機數產生方法
switch a
case 'radiobutton1'%均勻分佈(設計框架時,只需在下面寫do somthing)
%判斷是否輸入生成範圍
% b=size(get(handles.edit3,'string'))
% assignin('base','size',b) %方便在工作區監控變量的指令)
size1=size(get(handles.edit3,'string'))
size2=size(get(handles.edit4,'string'))
if (size1(2)>0) & (size(2)>0) %這是我判斷不會輸出空字符串不會報錯的方法了。如果直接==''這樣,對於有字符輸入,會報錯:維度不一致
min=get(handles.edit3,'string')
max=get(handles.edit4,'string')
min=str2num(min)
max=str2num(max)
if min==max %輸入的範圍不能相等
throw(exception) %扔出一個異常,被首級的try..catch.. 捕獲,執行首級的命令。
%要看清try...catch... 的分級
end
else
%默認設置
min=0
max=1
end
assignin('base','max',max)
R=min+(max-min).*rand(rand_num,1)%[20-100] %均勻分佈
case 'radiobutton2'
%下面分析和上面雷同,正態分佈
size1=size(get(handles.edit7,'string'))
size2=size(get(handles.edit8,'string'))
if (size1(2)>0) & (size(2)>0)
mean=get(handles.edit7,'string')
standard_deviation=get(handles.edit8,'string')
mean=str2num(mean)
standard_deviation=str2num(standard_deviation)
else
mean=0
standard_deviation=1
end
assignin('base','mean',mean)
assignin('base','standard',standard_deviation)
%from a normal distribution with mean 1 and standard deviation 2.
%r = 1 + 2.*randn(100,1);
R=mean+standard_deviation.*randn(rand_num,1);%正態分佈,均值爲0,方差爲1
case 'radiobutton3'
%do something 泊松分佈
lam=70
R=poissrnd(lam,rand_num,1);
case 'radiobutton4'
%do something 幾何分佈
size1=size(get(handles.edit6,'string'))
if size1(2)>0
p=get(handles.edit6,'string')
p_=str2num(p)
% assignin('base','p_',p_)
if p_>100|p_<1
% ME=MException('myfun:valid value','value %s is valid',p)
% throw(ME) %這裏是自定義異常,並拋出,後來沒有用到
throw(exception)
else
p_=p_/100
R=geornd(p_,rand_num,1)
end
else
throw(exception)
end
case 'radiobutton5'
%do something 二項分佈
size1=size(get(handles.edit6,'string'))
if size1(2)>0
p=get(handles.edit6,'string')
p_=str2num(p)
assignin('base','p_',p_)
if p_>100|p_<1
throw(exception)
else
p_=p_/100
R=binornd(50,p_,rand_num,1);
end
else
throw(exception)
end
end
%繪製直方分佈圖
axes(handles.axes1)
hist(R,num)
draw=draw+1
catch exception
warndlg('輸入了無效值,請重新輸入','warning string')
end
小總結:
- 各種分佈的使用方法
用matlab生成各種分佈的隨機數並做直方圖 - 異常處理
引發異常
捕獲異常
(2)多個單選按鈕的設置
兩個思路:
1.通過設置按鈕組的回調函數
2.通過設置所有的按鈕 的 回調函數
下面的例子講的非常詳細:
MATLAB中的單選按鈕和按鈕組
下面我是通過第一個思路設置
% --- Executes when selected object is changed in uibuttongroup2.
function uibuttongroup2_SelectionChangedFcn(hObject, eventdata, handles)
% hObject handle to the selected object in uibuttongroup2
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%方法二
%這裏代碼解釋了上面爲什麼要異常處理,如果是默認選擇而不點擊,根本就不會進入這個響應函數,相應的handles 裏面 就沒有 str_button 這個屬性
handles.str_button=get(hObject,'tag')
%保存數據
guidata(hObject,handles)
(3)取消置數
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.edit1,'string','') %設置空值的方法
set(handles.edit2,'string','')
set(handles.edit3,'string','')
set(handles.edit4,'string','')
set(handles.edit7,'string','')
set(handles.edit8,'string','')
set(handles.edit6,'string','')
set(handles.radiobutton1,'value',1)%使能當前
最終效果(分佈圖展示 和 數據異常報錯)
儘管代碼可能寫的有些累贅,如果有更好的方法,更簡潔的代碼實現可以討論區交流~