Matlab GUI入門-直方分佈圖界面製作

前言

製作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

小總結:

  1. 各種分佈的使用方法
    用matlab生成各種分佈的隨機數並做直方圖
  2. 異常處理
    引發異常
    捕獲異常

(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)%使能當前

最終效果(分佈圖展示 和 數據異常報錯)
在這裏插入圖片描述
在這裏插入圖片描述
儘管代碼可能寫的有些累贅,如果有更好的方法,更簡潔的代碼實現可以討論區交流~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章