matlab gui 編程

目   錄

 

1、GUI新手之——教你讀懂GUI的M文件... 10

2、GUI程序中改變current directory引起的問題... 15

3、GUI中h0bject和handles 的區別... 16

4、handles結構中句柄和對象的關聯問題... 17

5、Matlab利用定時器連續顯示圖片的問題... 19

5-1、GUI中實現在圖片任意位置上標註text. 22

5-2、使用edit的另外一種callback. 22

6、MATLAB 如何實現圖像的任意裁減?... 22

7、座標軸標註刻度、網格、文字方向... 23

8、Matlab中對uitable的操作:調節各列寬度,設定某列是可編輯的... 24

9、將在Matlab下編寫的GUI轉成獨立於Matlab平臺的應用程序... 25

10、要將用Matlab語言編寫的函數文件編譯成可獨立執行的*.exe文件... 28

11、matlab GUI程序轉換成exe可執行文件... 31

12、gui生成獨立的應用程序的發佈問題... 33

13、GUI控制simulink模塊及參數的綜合實例!... 34

13-1、在axes顯示圖像後,在圖像上單擊鼠標時,回調函數的定義規則和使用方法... 35

14、如何在循環中加入waitbar,並在waitbar上添加‘取消’按鈕... 36

15、在matlab中對信號進行FFT變換... 38

16、動態顯示figure中曲線的x-y座標值的一個函數... 40

17、在GUI界面的打開按鈕中,如何對文件進行操作... 42

18、Matlab不同控件之間的數據傳遞問題... 45

19、在edit box裏輸入相關數據後,直接按回車鍵,不用鼠標點擊pushbutton 就可以直接執行... 46

19-1 GUI使用editbox輸入數據後如何自動清除數據... 46

20、在GUI中,計算結果怎麼用excel來保存到指定的文件夾中... 47

21、如何得到popupmenu選項中最後一個字符串的VALUE值... 49

22、回調函數互相調用的問題... 49

22-2string和number相互轉換的問題... 50

23、這樣的功能的pushbutton的callback怎麼寫呀,謝謝了... 50

24、GUI中axes使用subplot時的清空及axes大小的固定的解決方法... 51

25、退出GUI時如何把全局變量中的值清空?... 53

26、從串口接受數據時,如何把波形繪製到指定的座標軸上?... 53

27、兩個GUI之間如何傳遞數據... 55

28-1 幾個有用的帖子... 57

28-2、GUI之間互相調用和關閉問題... 60

29、GUI timer定時器... 60

30、如何在循環中加入waitbar. 61

31、如何連續讀入圖片!!... 62

32、如何把此次輸入的值保存爲下一次初始化的值... 63

33、Matlab關於解決自動保存gcf的問題... 63

34-1、在matlab裏面如何讀取excel裏面的數據或者寫入數據... 65

34-2、在excel中連續輸入數據。... 66

35、Matlab GUI不同控件之間的數據傳遞問題... 68

36、怎麼統計一個十進制數中"0"的個數??求助!... 69

37、Matlab對listbox裏的條目能否一條條單獨設置回調函數?. 70

38、鍵盤操作:matlab GUI中如何取得從鍵盤輸入的按鍵的鍵值... 72

39、GUI如何響應鼠標事件... 73

40、matlab 截圖、圖像處理... 76

41、MATLAB GUI中利用定時器製作動畫 - [MATLAB]. 84

42、MATLAB如何從GUI中返回參數 - [MATLAB]. 86

43、MATLAB 中GUI子程序的參數傳遞 - [MATLAB]. 87

44、Matlab保存axes上的圖的問題(包括座標軸)... 88

45、Matlab鼠標控制的兩個GUI例子(附代碼)... 91

46、分享初學的一個GUI例子--新手好好看看(圖)... 97

47、axes清除畫面... 113

48、GUI中調用自己製作的幫助文件... 114

49、關於從gui調用simulink. 114

50、如何將菜單中退出項和窗口關閉的回調函數合併?... 117

51、matlab 日曆程序... 119

52、如何在GUI裏得一個axes實現雙Y座標軸... 121

53、如何實現動態的GUI界面... 121

54、關於GUI和simulink參數傳遞和執行... 122

55、代碼運行時間的計時方法... 134

56、如何在GUI指定的axes中再畫一個axes. 135

57、按下鼠標左鍵並拖動鼠標時的作圖方法... 136

58、圖像處理相關資料... 137

59、保存axes座標軸上畫的曲線或圖形... 140

60、在GUI中如何打開IE. 141

61、gui輸入數據,通過rs232傳給芯片... 141

62、Matlab關於gui和excel的問題... 142

63、matlab 如何顯示數學公式... 145

64、修改matlab自帶的tabdlg的字體和顏色... 148

65、求助 Matlab的RGB彩色圖合成... 148

66、如何刪除已繪製的曲線?... 149

67、總結一下,MATLAB中隨機矩陣獲得... 150

68、【原創】GUI設計中背景音樂的定製與關閉... 153

69、Matlab如何改變GRID 網格線的顏色?... 156

71、把plot圖上的某些曲線排除在lengend之外,即不用legend標註出來... 157

72、如何連續對矩陣追加數值... 158

73、兩個等直徑圓管的交線... 160

74、Matlab的csvread讀取數據的問題... 161

75、在對數座標系插值的問題... 162

76、實現在原有圖像上的部分圖像變爲白色... 162

78、如何實現雙擊listbox中的條目才表示選中... 163

79、如何刪除矩陣中的NaN. 164

80、用平行截面法討論由曲面z=x^2-y^2構成的馬鞍面形狀。... 164

81、如何利用ode45解方程... 165

82、Matlab圖片如何批處理?pic變量逐一讀取文件夾所有圖片名... 165

83、方程爲:exp(-x)=cos(x),用迭代法求出最小的正根,當相對誤差<=10e-6時,求根結束。... 166

84、通過鼠標點擊控制循環... 166

85、圖像經連續小波分解後的顯示效果圖... 167

85-1、怎樣查看圖像的屬性... 169

86、想產生如下的矩陣:6行10列,每行都是1 2 3 4 5 6 7 8 9 10。... 169

87、textread讀取.txt中數據... 169

88、數制之間的轉換怎麼實現... 170

89、matlab讀取大數據文件的方法... 172

90、從狀態空間方程轉換爲傳遞函數... 174

91、生成0 1 2 3 4 5 6 7 8 隨機出現大小爲20X20的矩陣!... 174

92、存儲繪圖過程,並播放視頻... 175

93、如何同時讀入多個文件,並作圖?... 175

94、MATLAB GUI編程中幾個有用的程序段... 177

95、Matlab如何在給定區域隨機取點?... 180

96、數據如何導入到workspace中,並執行?在GUI裏面,怎麼傳遞處理。... 180

97、matlab下畫‘心’的程序。... 181

98、點到直線的距離怎麼求?... 181

99、如何繪製正態分佈圖?... 185

100、matlab作圖時,如何只保存圖像而不顯示圖像... 185

101、在三維圖中只顯示x,y軸,不顯示z軸... 186

102、cell array和矩陣的顯示... 186

103、矩陣形式的轉換... 188

104、如何判斷鼠標是否在figure內的某一區域?... 189

105、一個有用的程序... 189

106、窗口的最大化、最小化、圖標、置頂... 191

107、連續生成文件名的問題... 193

108、編輯框edit中輸入公式後的繪圖問題... 194

109、MATLAB中plot命令繪圖微調的幾個註記 (轉自職業倉庫)... 195

110、MATlab 三維圖中顯示z座標軸的極大極小值... 203

111、如何一次性清空GUI程序的handles結構中的變量... 203

112、Matlab如何給元胞中的每個一維向量前增加同一個數?... 204

113、用guide生成的不同GUI之間控件的互相操作... 206

114、自定義Matlab figure 工具欄按鈕... 208

115、matlab 有沒有按某個小數位數做四捨五入的函數?... 209

116、有關矩陣中小於某值的數取整的問題... 209

117、Matlab表面被截後的部分... 210

118、如何是imshow顯示的圖像充滿整個figure?... 211

119、圖像顏色統計直方圖... 211

120、Matlab如何將大元胞數組寫入到txt文件... 212

121、構造特殊矩陣(右螺線狀的)... 213

122、figure中多座標軸中曲線的legend標註... 214

123、GUI中鼠標選中並顯示曲線的類型及座標... 215

124、Matlab中y=1\x圍繞y軸旋轉形成的旋轉曲面... 218

125、GUI程序一開始以‘最大化’顯示的問題... 219

126、如何實現文本自動轉換... 219

 

 

 

 

 

 

 

 

 

1、GUI新手之——教你讀懂GUI的M文件

GUIDE生成的GUI的M文件控制了你編制的GUI界面的所有屬性和行爲,或者說外觀和對用戶操作的響應。比如說按下一個按鈕或者選擇了一個菜單項之類。M文件包括了運行你整個界面程序所需要的全部代碼,包括所有GUI組件的CALLBACKS函數。其實這些callbacks函數算是M文件裏的子程序,callback裏面就填寫你所期望程序做的動作,比如畫一個圖或者算一個算式。

插入,關於什麼是子程序    懂的人跳過^_^

function [avg, med] = newstats(u) % Primary function

% NEWSTATS Find mean and median with internal functions.

n = length(u);

avg = mean(u, n);

med = median(u, n);
function a = mean(v, n)            % Subfunction
% Calculate average.
a = sum(v)/n;
function m = median(v, n)          % Subfunction
% Calculate median.
w = sort(v);
if rem(n, 2) == 1
   m = w((n+1) / 2);
else
   m = (w(n/2) + w(n/2+1)) / 2;
end
   以上就是一個大的程序function nestats,它下面另外包含了兩個小的function mean和median,這樣在大程序的裏面就可以以如上的方式調用它們了。子程序的好處在於如果你總是要重複用到一組計算方式的時候,那你就把這組重複計算方式類似以上的方法編寫成一個子程序,避免大量重複代碼。在M文件裏面,會看到最外層,也就是最上面那一一行

function varargout = setfire(varargin)   

(setfire是我m文件存的名字)就是那個大程序框,它下面有很多小function 比如什麼什麼creatFcn或者什麼callback之類。看上去那個複雜,其實就跟上面這個一樣的道理。只不過是M文件的類似avg = mean(u, n);med = median(u, n);這兩句話系統隱藏(就當它是隱藏好了)起來了,它會在你點擊鼠標(或者響應操作)時候自動去調用執行一次callback函數。所以你只用管把代碼寫入響應的函數名下就行了。至於系統爲什麼會自動調用,我們不用管,我們只用知道,我點擊鼠標,我拖動滑竿時,系統會執行哪裏的代碼。就夠了。

一、M文件的數據管理模式 

Sharing Data with the Handles Structure :用handles這個東西共享數據

    在你運行你的GUI的時候,M文件會自動生成一個叫做handles的東西(準確的說它屬於handles 類型的結構體,且取的名字也叫做handles),不用管那麼複雜,只用知道你可以從它這裏找到GUI的所有數據,比如說控件的信息,菜單信息,axes信息。想象handles就是一個缸了,它裏面裝載了所有的信息,而且這個缸在各個控件的callback之間傳來傳去,理所當然那每個控件的callback都可以放入一些想放入的數據,也可以從裏面取出任何想要的數據包括別的控件的信息(比如滑竿的當前值,edit text的當前值)和別的控件放進去的數據。
    所以,用handles可以達到的目的有兩個:

a,各個控件的callback的信息交換

   (current_data是隨便設置的變量名)
   handles.current_data = X; 在某控件下的callback寫入這一句,就表示你把這個數據放缸裏了
   guidata(hObject,handles);接着別忘了保存~!
    然後在你需要的地方把它從缸裏撈出來
     X1 = handles.current_data;

b,讀取GUI控件的信息,自然也可以設置GUI控件的信息(比如說背景色隨着按鈕點擊而變換之類,或者你想讓按鈕A點一下,字符B跳一下,也行。)

all_choices是隨便取的變量名,my_menu是你那個菜單項的TAG名字 
     all_choices = get(handles.my_menu, 'String');
     current_choice = all_choices{get(handles.my_menu, 'Value')};
這樣current_choice就得到了用戶界面操作中,目錄或者菜單的選擇結果。
所以,要什麼信息,直接用handles.你的對象 就行了。
存什麼信息也直接handles.你的對象  就行了。
如果是自己的數據,就.變量名;如果是控件信息,就用get set

二、M-File裏的各個函數代表什麼意思 

在設計面板設計排列好自己需要的各種按鈕或者編輯框之後,下一步任務便是添加自己的響應代碼。

Opening function  添加在它名下的代碼,在GUI開始運行但是還不可見的時候執行。這裏的代碼一般都是做一些初始化工作的。

Output function  如果有需要,可以向命令行輸出數據。(這個函數我沒用過,不多說了^_^)

Callbacks   每一次點擊按鈕或者向輸入框輸入數據或者拖動滑竿,這些控件名下的callback就會執行一次。

函數的輸入參數
    M-File名下的全部function都會有這兩個輸入參數
    hObject  它代表的是當前的這個控件(也就是你點哪一個按鈕或者拖的哪一個滑竿)
    handles  它代表的是現在這整一個GUI界面
    對這兩個變量進行修改後
    guidata(hObject, handles);   進行保存,否則修改無效;P

三、Opnning Function

   這個函數名下的代碼 在界面可見之前執行。其實你也可以在這個函數名下用handles.什麼tag 來獲得組件的信息。因爲在Opnning函數之前,所有的組件就已經生成了,只不過openning函數是把這些組件‘打開’,讓它們顯示出來。所以你可以在這個函數下面,添加代碼,對界面做一些初始化工作。比如,計算一些數據,顯示一幅圖或者別的什麼工作。
    function my_gui_OpeningFcn(hObject, eventdata, handles, varargin)
    另外兩個輸入參數eventdata是matlab的保留參數,爲以後開發準備的,我們不用管它。varargin 它裏面保存了,傳進來的命令行。
    varargin怎麼理解呢?
-------------    
    my_gui('Position', [71.8 44.9 74.8 19.7]) 
%GUI也是函數,它只不過是有個界面的函數。它的調用,同樣是 函數名(輸入參數)。
    這裏就表示GUI在打開時,位置這個屬性被設置成了右邊那個值。也就是在這個位置打開GUI。Position是你GUI界面的一個屬性。(要想知道各個控件有什麼屬性,在它上面雙擊就看到了。)所以同樣,也可以用這種方式輸入其他的初始化命令。
    my_gui('路人甲','年十八')
    但如果你輸入別的,左邊那個根本就不是界面的屬性名稱。這是輸入的參數就保存在varargin裏面。也就是 vararging{1}='路人甲' vararging{2}='年十八'。
    這樣也可以達到向調用的GUI傳入數據的目的。

四、Output Function
  Output function    有輸入自然就有輸出,顧名思義,這個函數就是用來輸出的。
function varargout = my_gui_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
  varargout{1} = handles.output; 
    這個函數不是我們自己編寫的,也不是我們負責調用。我們只用知道要傳出去的數據,其實是放在vararout這個變量裏面的。但是我們在別的控件的callback是叫不到vararout這個變量的,因爲你去看這些callback的輸入參數裏並沒有vararout這個變量給它用。所以我們只能間接修改handles.output這個變量。(當然在後面別忘了添加guidata(hObject, handles);保存修改) 
    因爲默認的output函數裏面varargout{1}=handles.output,也就是修改了vararout。
(所以知道了原理,output只是一個名字而已,你也可以用任意別的名字,或者添加更多的輸出變量,只要在outputFcn下面添加 varargout{2}=handles.第二個變量名 。。。。類似) 
    guidata(hObject, handles)之後不要立即delete窗口命令,因爲這時候outputfcn沒有再執行一次,也就是你剛剛修改的output並沒有更新到varargin裏面去。    所以要麼單獨設計一個關閉按鈕;要麼跟uiwait(handles.figure1);uiresume合用。

五、Callbacks回調函數 
    當你對組件做點擊或者別的動作,則自動調用相應的callback。callback的名字取決於你的控件的tag和控件類型以及響應類型。
function print_button_Callback(hObject, eventdata, handles)

2、GUI程序中改變current directory引起的問題

fig和m文件和見下,主要是用來導入數據(用於導入兩個文件夾中的txt文件,每個txt有兩列,第一列時間,第二列電壓),運行後發現只能點擊一個pushbutton,當點擊第二個時會出現以下錯誤:
??? Undefined function or method 'fenbianlv1' for input arguments of type 'struct'. Error in ==> @(hObject,eventdata)fenbianlv1('pushbutton2_Callback',hObject,eventdata,guidata(hObject)) ??? Error while evaluating uicontrol Callback 
    應該是某個地方設置的問題。pushbutton裏面的函數體好像沒問題。就算在第二個函數體裏面只編寫一個很簡單的賦值語句也會出現同樣的錯誤,調試發現點擊第二個pushbutton時根本沒有進入到這個函數體內。好像是點擊了一個pushbutton後再點擊第二個pushbutton它就找不到這第二個pushbutton的callback函數了。但如果兩個pushbutton都編寫簡單的賦值語句發現沒有錯誤,說明第一個pushbutton的callback函數體代碼對第二個pushbutton的callback調用產生了影響,但是是什麼地方影響了一直髮現不了。

解決辦法: 

是在pushbutton1和pushbutton2的回調函數裏用cd(dataRoute)把matlab的current directory的路徑給改了,數據讀取完成後,沒有恢復到原先的路徑,導致程序出錯。

 

讀取數據前先保存原先的路徑:

oldpath=cd;

數據讀完後再恢復原先的路徑:

cd(oldpath);

修改後的程序見實例程序:fenbianlv1.

3、GUI中h0bject和handles 的區別

剛學GUI,舉個例子,就是Pop_up Menus吧,他的回調函數是這樣的:
function=pushbutton1_Callback(hObject, eventdata, handles)
然後我想問的是:Val=get(h0bject,'Value')和Val=get(handles.pushbutton1,'Value');這兩個的值是一樣的嗎,如果是一樣的,那h0bject和handles在使用時有什麼區別?

答: 

在MATLAB GUI中,數據分兩種:GUI data和application data。 兩種數據的存取機制是相同的,但是GUI data使用起來比較方便。
        每一個GUI 圖形界面都維持一個和自己的界面的圖形(figure)相聯繫的一個handles數據結構,這個數據結構中容納圖形界面內所有控件(按鈕、列表框、編輯框等)的句柄,相當於一個大的“容器”,裏面存放了figure內所有控件的句柄。同時,handles結構也可以被figure內所有控件的回調函數訪問,因爲回調函數的輸入參數中都有handles結構。此外,在控件的回調函數內可以把數據存儲到handles結構中。
      handles結構數據的取得和存儲是通過guidata函數來實現的。 
     例如:在編輯框edi的回調函數內想獲得t編輯框的句柄,hObject可以,也可以用handles.edit,這兩個值是一樣的,沒有區別,只不過獲得控件句柄的方式不同而已:hObject是調用回調函數時直接傳過來的,handles.edit是從handles結構中取得的。但是,在控件的CreateFcn函數中如果想訪問控件,必須用hObject,而不能用handles.edit,因爲這時控件還沒被創建,其句柄還沒有加入到handles結構中。
    各控件的回調函數中,hObject的值是不一樣的,分別代表調用回調函數的控件的句柄,而handles結構卻是一樣的。這種機制便於figure內的不同控件的回調函數內傳遞數據。

 

4、handles結構中句柄和對象的關聯問題

1、問題1: 

>> handles.axes1=axes('tag','tag1');

delete(handles.axes1);handles
handles = 
    axes1: 0.027
figure中的座標軸已經被刪除了,
但是爲什麼handles.axes還存在?
還有運行下面出錯:
>> get(handles.axes,'tag')
??? Reference to non-existent field 'axes'.

問題癥結: 

delete(handles.axes1)是刪除了和handles.axes1句柄相關聯的對象,但是handles結構沒有清空,其中仍然有axes1句柄的數值。只是這個句柄已經失效了,因爲沒有對象和它關聯了。所以,你再用get或set想獲得或設置對象的屬性時就會出錯。

另,設定的是handles.axes1,不是handles.axes,所以提示在handles結構中不存在axes這個句柄,而不是無效的句柄(invalid handle object)。

get(handles.axes,'tag') ??? Reference to non-existent field 'axes'.

2、問題2:

matlab help的一個例子:
% Create figure to use as GUI in your main function or a subfunction
figure_handle = figure();
% create structure of handles
myhandles = guihandles(figure_handle); 
% Add some additional data as a new field called numberOfErrors
myhandles.numberOfErrors = 0; 
% Save the structure
guidata(figure_handle,myhandles) 
不是很明白guidata的用法,figure_handle和myhandles之間是什麼關係?是如何進行保存的。

答:

這就是GUI裏面的句柄和包含句柄的結構之間的區別。 
figure_handle是和所創建的figure相關聯的句柄,通過語句
myhandles = guihandles(figure_handle); 
所獲得的是和figure_handle句柄相關聯的一個結構,此結構包含了該figure內所有控件的句柄,
比如:菜單、工具條等等控件的句柄,其中也包含figure_handle這個句柄。myhandles結構可以
儲存與GUI有關的一切數據。
guidata(figure_handle,myhandles) 是保存與figure的句柄figure_handle相關聯的myhandles結構。

5、Matlab利用定時器連續顯示圖片的問題

利用定時器連續顯示圖片,裏面用的是image函數,但image函數顯示圖片大小會失真。於是改用imshow函數,能解決大小失真的問題。但每次點擊播放,都會彈出可惡的窗口。調試發現,發現每次調用imshow時都彈出來。搞不清問題出在哪裏。以下是圖像播放的代碼:
function picture_play(hobj,event,handles)    
global filename1;
global pathname1;
global number_of_file1;
global index1;
global A;
      index1=index1+1;
     if index1==number_of_file1+1 
        index1=1;
     end
     A=imread([pathname1,filename1{index1}]);  
     cla;
     imshow(A,'parent',handles.axes4);     
     strFileName=fullfile(pathname1,filename1{index1});
     set(handles.filename_edit,'string',strFileName);

 

解決辦法:

經過調試,追蹤imshow函數的內部,終於找出了問題:
  打開figure的屬性編輯器,可見fugure的‘HandleVisibily’屬性值默認爲‘callback’,把它改爲‘on’;同時確保‘NextPlot’的屬性值爲‘add’,問題解決。
  另,新建的figure對象的HandleVisibily’屬性,默認值都爲callback。
   幫助文件說,這是matlab採取的一種保護措施,HandleVisibily’屬性值默認爲‘callback’,figure的句柄只對其所包含控件的回調函數來說是可見的。這也可能是imshow和image函數在處理這一問題上的不同吧。

注意:類似的問題以前在論壇中也有會員提出過:

如何把波形繪製到指定的座標軸上?發表於 2007-11-21 11:27 AM

在GUI做了一個有三個座標軸的界面,用於顯示從串口接收到的數據。
串口設置如下:
g = serial('COM1') ;
g.InputBufferSize= 4096;
g.OutputBufferSize= 4000;
g.BaudRate= 9600;
g.BytesAvailableFcnMode = 'byte'; %中斷觸發事件爲’bytes-available Event’?
g.BytesAvailableFcnCount = 45; %接收緩衝區每收到45 個字節時, 觸發回調函數
g.BytesAvailableFcn = @instrcallback; %得到回調函數句柄
回調函數instrcallback的繪製波形部分程序如下:
t =1:1:4;
axes(Ch1_Dis);  %Ch1_Dis爲座標軸1句柄
hold on
plot(t,ch1);
axes(Ch2_Dis);   %Ch2_Dis爲座標軸2句柄
hold on
plot(t,ch2);
axes(Ch3_Dis);   %Ch3_Dis爲座標軸3句柄
hold on
plot(t,ch3);
但是每次通過串口觸發回調函數instrcallback時,執行到plot指令都會另建一窗口figure1,將波形繪製到另建的窗口中。
當不通過串口觸發回調函數,而是在一按鈕的回調函數中調用instrcallback時,就會把波形繪製到指定座標軸中。

5-1、GUI中實現在圖片任意位置上標註text

利用gtext函數。

gtext displays a text string in the current figure window after you select a location with the mouse.

gtext('string') waits for you to press a mouse button or keyboard key while the pointer is within a figure window. Pressing a mouse button or any key places 'string' on the plot at the selected location.

5-2、使用edit的另外一種callback

如果edit是多行的。想點擊每一行的時候,能執行不同的事件,那麼可以使用:

代碼:
contents=get(hObject,'String'); 
a=contents(get(hObject,'Value'))

那麼a就是你選擇的對應的那一行。

6、MATLAB 如何實現圖像的任意裁減?

(1)使用imrect和imcrop函數相結合,就可以實現截圖功能。

用imcrop函數,例如:

I = imread('circuit.tif');

    I2 = imcrop(I,[60 40 100 90]);

    figure, imshow(I)

figure, imshow(I2)

見自己編寫的程序:picturecrop。

(2)剪取圖像的中間區域:我想裁剪圖像中間的部分,就是去掉圖像周圍部分!

1、首先取得圖像的顯示範圍:
x1=get(gca,'xlim');
y1=get(gca,'ylim');
width=x1(1,2)-x1(1,1);
height=y1(1,2)-y1(1,1);
2、求的圖像中心的座標:
x0=x1(1,1)+width/2;
y0=y1(1,1)+height/2;
3、如果想剪切圖像顯示區域的1/4(以圖像中心向四周剪切),則:
a=width/4;
b=height/4;
4、計算裁剪區域:(以圖像中心點爲裁剪中心)
rect=[x0-a/2 y0-b/2 a b]
5、用imcrop裁剪:
a=imcrop(A,rect);

7、座標軸標註刻度、網格、文字方向

用兩個矩陣畫了一個圖像,用grid on添加了網格,但是默認的網格太稀了,想要密一點的,該怎麼解決?

1、用 set(AX,'XMinorGrid','on');set(AX,'XMinorGrid','on');

2、(1)控制座標軸尺度長度:set(gca,'XLim',[-pi/2 pi])

(2)定製自己想標註的刻度:

set(gca,'XTick',[-pi/2:pi/4:pi])   %%%座標軸最小值,步長,最大值

3、xlabel(‘x軸’,’rotation’,45);%x軸文字的方向,0爲水平方向,90爲垂直方向

4、將座標的x軸做成10 的4次方,而不是10000這種形式。

set(gca,'xlim',[0 10e4]);

8、Matlab中對uitable的操作:調節各列寬度,設定某列是可編輯的

解決辦法:

例子:例如想建立三行三列的table,並且要求第三列是可編輯的,其它兩列是不可編輯的,
代碼如下:
f = figure('Position',[100 100 400 150]);
dat =  {6.125, 456.3457, 2.30;...   %初始化各列的數值
        6.75,  510.2342, 1.31;...   
        7,     658.2,    3.52};
columnname =   {'Rate', 'Amount','Value'};     %各列的名稱
columnformat = {'numeric', 'bank', 'numeric'};  %各列的數據類型
columneditable =  [false false true ];                %各列是否是可編輯的,true是可以編輯,false是不可編輯
t = uitable('Units','normalized','Position',...
            [0.1 0.1 0.9 0.9], 'Data', dat,... 
            'ColumnName', columnname,...
            'ColumnFormat', columnformat,...
            'ColumnEditable', columneditable);
顯示結果如下:



其中,第三列的數值是可以編輯的。

 

9、將在Matlab下編寫的GUI轉成獨立於Matlab平臺的應用程序

將在Matlab下編寫的GUI轉成獨立於Matlab平臺的應用程序Standalone Application。

具體過程:

目的是把一個Matlab GUI轉成Standalone Application即不在Matlab平臺下也可打開。

用的GUI文件見:單純形法實現(GUI based on Matlab)http://www.ilovematlab.cn/viewthread.php?tid=7634&highlight=%2Bfaruto 
首先新建:File——》New——》Deployment Projiect,出現如下界面:

 

選擇Standalone Application

 

在main function 中添加要轉化的M文件:

 

單擊Build project

等待編譯完成:

 

編譯完成後,在工作目錄下會生成相關項目的文件夾:

其中distrib中有生成的.exe文件:

運行該.exe文件即可(這個.exe文件就是一個Standalone Application)。

 

最後生成的Standalone Application:[attach]8930[/attach

10、要將用Matlab語言編寫的函數文件編譯成可獨立執行的*.exe文件

要將用Matlab語言編寫的函數文件編譯成可獨立執行的*.exe文件(即可脫離Matalab環境的執行程序),首先要安裝和配置好Matlab Compiler,一般來說,在安裝Matlab時就已經安裝了相應版本的Matlab Compiler。只是不同版本的Matlab,其編譯器的使用方法有一定的差異,這一點要引起一定的注意。
        在確定安裝好Matlab Compiler後,還需要對Compiler進行適當的配置,方法是在Matlab命令窗口輸入:
        Mbuild –setup
        然後根據提示執行相應的操作,使用者可根據自己計算機中現有編譯器的情況選擇合適的編譯器,如VC++ 6.0、VC++7.0、Bland C的編譯器等,目前Matlab好象還不支持VC++8.0(我計算機安裝的就是VC++2005,Matlab就無法識別)。當然,如果你的計算機里根本就沒有安裝其他任何語言的編譯器,也可選擇Matlab自帶的Lcc編譯器,其實這個編譯器對大多數用戶已經夠用了(我就是選擇的Matlab自帶的Lcc編譯器)。
        配置好編譯器後,自然就是對自己編寫的M文件進行編譯了。
        將M文件編譯爲獨立可執行文件的語法是:
        >>mcc –m fun1.m fun2.m…..
        其中fun1就是最後的可執行文件的名稱。
        另外,也可通過採用命令開關-o指定編譯最終目標文件的名稱,如 mcc –m main.m –o mrank_main,就是將編譯後的文件指定爲mrank_main.exe。
        編譯後的生成文件根據編譯器的版本不同而不同。具體的可參閱相關資料。
        如果要在沒有安裝matlab的計算機上執行編譯後的程序,首先要將\MATLAB701\toolbox\compiler\deploy\win32中的MCRinstaller.exe安裝到該計算機上(7.0以前的版本是mglinstaller.exe)。
        其次是要將“MCRinstaller.exe安裝目錄\runtime\win32”這個路徑添加到該計算機的環境變量中,添加的方法是:
        右擊“我的電腦”“屬性”“高級”“環境變量”“添加”指定一個變量名,然後將上述路徑複製到裏面就可以了。
        第三步是將編譯生成的相相關文件拷貝到同一目錄下(當然其他目錄亦可)。
        第四步是打開MS-dos操作窗口,進入到編譯後的*.exe程序所在的目錄,執行編譯生成的*.exe文件即可。
        需要說明的一個問題:
        如果你的程序還附帶有圖片(如Version上的圖標)、Web頁面(如help文檔),在編譯的時候可能無法與M文件一起編譯(因爲我沒有試過,也沒有看到有關這方面的介紹),這沒有關係,先在計算機上執行一次你編譯後生成的獨立可執行文件,這時在同一目錄下會生成一個以你編譯後的程序名+_mcr結尾的文件夾,這時,你只需要把與程序相關的圖標和Web頁面拷貝到該文件夾中的Matlabprogram下面的一個子目錄(一般與用於編譯的文件夾名相同)中即可。
         
        其他的方法還有:(以下是網上搜索到的方法,沒有試驗過,有興趣的朋友可以試一試)
        方法一:在matlab下的workspace裏打comtool,點file-open project將我們先前建好的comtest.cbl工程文件打開,再點component--package component就實現了打包,此時到comtest\distrib文件夾裏看,生成的comtest.exe就是打包後的解壓程序,雙擊它會解壓出一些文件,再點擊解壓出來的_install.bat就可以實現安裝 
         
        方法二:如何將gui生成exe ?
        已有gui.m文件和gui.fig文件
        1 在matlab的command窗口中輸入 
        mcc -B sgl GUI.m 
        2.將上步生成的文件包括*.m 文件和*.fig文件一起考到待運行的機器 
        此時仍需matlab所必需的動態連接庫。
        3. 將 <matlab path >/extern/lib/win32/mglinstallar.exel拷貝到到待運行機器上
        4.在機器上先運行mglinstallar.exe, 然後選擇解壓目錄,將在指定目錄下解壓縮出bin和toolbox兩子目錄,其中在bin\win32目錄下就是數學庫和圖形庫脫離MATLAB運行所需的所有動態連接庫,共有37個。可以將這些.dll考入system32, 也可以直接放在應用程序目錄下。而toolbox目錄則必須與應用程序同一目錄。
        5.大功告成。

matlab生成獨立可執行的程序 
引用

靈夢捕手 的 matlab生成獨立可執行的程序

一、生成獨立可執行的程序(exe文件)步驟

1、安裝編譯器。可有多種選擇,本機安裝的是microsoft visual c++ 6.0;

2、設置編譯器。在matlab命令行輸入mbuild -setup,選擇安裝的c編譯器;

3、調用編譯器。輸入mcc -m filaname,filaname爲要轉成exe的m文件;

在以前的版本中,用編譯命令mcc -B sglcpp filaname;自2006的版本後,替換爲mcc -m filaname;

4、安裝MATLAB7\toolbox\compiler\deploy\win32目錄下的MCRInstaller。

二、脫離matlab運行可執行程序

MCR是由matlab的運行環境,佔用不到400M的對於用不同matlab版本生成的exe文件,MCR版本也會有不同,因此,在程序打包時,最好將相應版本的MCR一起打包。MCR環境的設置文件存放目錄如下:

                \MATLAB\R2007a\toolbox\compiler\deploy\win32

文件名爲MCRInstaller.exe。可將其拷貝到自己的文件夾中。

    在其它機器上運行exe文件前,首先安裝matlab的運行環境。在同一機器上可以並存不同版本的matlab環境。

Note: 將MCRInstaller.exe拷貝到你文件所在文件夾裏,用打包程序來打包,生成安裝文件,設定在解包過程中自動執行MCRInstaller.exe,同時將可執行文件的圖標放在桌面。

11、matlab GUI程序轉換成exe可執行文件

1.設置編譯器:

在確定安裝好Matlab Compiler後,還需要對Compiler進行適當的配置,方法是在Matlab命令窗口輸入:

Mbuild –setup, 按提示選擇matlab自帶編譯器LCC。

2.將腳本編譯爲可執行文件:

如項目文件包含:gui.m, gui.gif, fun1.m。

在此路徑下命令行輸入:mcc –m gui.m,生 成:mccExcludedFiles.log,ReadMe.txt,gui.ctf,gui.prj,gui_main.c,gui_mcc_component_data.c,gui.exe。其中:gui.ctf,gui.exe爲脫離matlab環境運行必需的文件。

3.在未安裝matlab的機器上運行可執行程序。

將R2 2007b\toolbox\compiler\deploy\win32中的MCRinstaller安裝到該計算機上,將生成可執行程序脫離matlab運行所需的函數庫。

將2中生成的gui.ctf,gui.exe拷貝到該計算機同一路徑。運行gui.exe將生成gui_mcr文件夾,包含程序運行所需的庫。至此完成。

4.去除獨立可執行程序運行時的“DOS黑窗口”。

以上生成的exe程序運行時首先彈出一個DOS界面窗口,如果不需要其輸出數據和錯誤信息,可將其去除。

matlba命令行輸入:

cd(prefdir) edit compopts.bat

此時compopts.bat打開,在文件最後添加:

set LINKFLAGS=%LINKFLAGS% -subsystem windows

如果程序比較複雜,易出現異常,則不建議去除這個dos窗口以便調試。

另外,這個辦法是適用於你用的編譯器爲LCC,如果是其他的,那麼所加語句有所不同

Microsoft Visual C/C++:

set LINKFLAGS=%LINKFLAGS% /SUBSYSTEM:WINDOWS

/ENTRY:mainCRTStartup

Borland:

set LINKFLAGS=%LINKFLAGS% -aa

5.遇到某些函數不能使用的問題。

我的程序中用到vpa函數,運行gui.exe出現:undefined method or function 'vpa' for input argument type of 'double'錯誤提示。而gui.m腳本在matlab環境可以運行。

原因:百度搜到的信息爲:matlab不支持符號工具箱的編譯。只好避開使用此函數。

12、gui生成獨立的應用程序的發佈問題

“將MCRInstaller.exe文件、file.ctf文件和file.exe文件打包,粘貼至目標機器上後,解壓,運行MCRInstaller.exe,將file.exe和file.ctf複製到應用目錄下,添加目錄<mcr_root>\runtime\win32到用戶系統路徑(<mcr_root>爲MCR安裝路徑。”)

1)這就話中“將file.exe和file.ctf複製到應用目錄下”是隻哪個應用目錄;

2)“添加目錄<mcr_root>\runtime\win32到用戶系統路徑(<mcr_root>爲MCR安裝路徑。)”怎樣添加目標到用戶系統路徑。

問題1:.exe和ctf在同一個目錄就可以,就是只要在同一個文件夾就行的。
問題2:用戶系統路徑的添加是在環境變量裏,我的電腦——>屬性——>高級——>環境變量,添加即可。

13、GUI控制simulink模塊及參數的綜合實例!

最近在論壇上學習,雖然進度很慢,但收穫不少!
現在將我在學習過程中對於GUI控制simulink時遇到過困難的一些功能做成一個綜合實例放在這裏,打個包希望給大家省點錢,也希望能夠幫助到論壇裏需要的朋友!同時以此感謝在我學習的過程中熱心幫助過我的朋友們,感謝論壇! GUI and Simulink.rar (14.88 KB)

該實例主要功能:
1、演示了GUI界面的佈局和效果;
2、演示了togglebutton、pushbutton對simulink模塊參數的設置方法;
3、演示了Edit text 和slider的聯合使用,及利用edit text 和slider 對simulink 參數的動態修改;
4、演示了simulink參數在GUI上的顯示和更顯;
5、語句進行了註釋,爲便於編譯沒用中文,大家湊或者看吧!

管理員:“會員RayneZ提醒:該帖子的樓主貼了一個GUI+Simulink的示例文件,但是有些小錯誤,matlab在運行的時候提示出錯。
      檢查了一下,錯誤原因在GUI_ex11.mdl這個文件中的fcn2模塊中的函數編寫有些問題
      第四行和第六行的邏輯判斷語句中的&應該改爲&&
       更改後程序可以正常運行。

13-1、在axes顯示圖像後,在圖像上單擊鼠標時,回調函數的定義規則和使用方法

想在一個axe上顯示一張圖,在點擊的時候放大圖片我使用的是imshow函數。當沒有顯示圖像的時候,單擊axe有反應,但是一旦imshow之後單擊就沒有任何反應了請問怎麼解決呢?

解決辦法:

調試了一下,可以解決的。方法如下:
(1)在你的GUI的OpeningFcn函數中加入如下代碼:
  axes(handles.axes1);
  Image=imread('C:\Users\liuhuanjin\Pictures\5HPQ1IFA00AN0001.jpg'); %讀取圖像
  hImage=image(Image); %顯示圖像,同時取得圖像的句柄(handle)

handles.hImage=hImage;%保存圖像的句柄到handles結構,以備後用
     guidata(hObject,handles);
   set(hImage,'ButtonDownFcn',{@myCallback,5}); % 設置圖像對象的

  ButtonDown回調函數爲自己定義的myCallback,並將5作爲參數傳遞給它。    

(2)在自己定義的myCallback函數中加入代碼:
          function myCallback(hObject,eventdata,arg1)
          ........%在此加入你的代碼

因爲圖像顯示後你點擊的是圖像,所以axes的那個ButtonDownFcn回調函數並沒有調用。

 

關於自定義的callback的參數傳遞方法有:

Callback Function Syntax

How to Specify as a Property Value

function myfile

set(h, 'StartFcn', 'myfile')

function myfile(obj, event)

set(h, 'StartFcn', @myfile)

function myfile(obj, event, arg1, arg2)

set(h, 'StartFcn', {'myfile', 5, 6})

function myfile(obj, event, arg1, arg2)

set(h, 'StartFcn', {@myfile, 5, 6})

 

(另外有用的代碼)

axes(handles.axes2);

iptsetpref( 'ImshowAxesVisible' , 'on' ); %顯示座標軸set(zoom,'Direction','In','Enable','on'); %顯示放大圖標

Image=imread('C:\Users\liuhuanjin\Pictures\5HPQ1IFA00AN0001.jpg');

hImage=image(Image);

set(hImage,'ButtonDownFcn',@myCallback);

handles.hImage=hImage;

 

14、如何在循環中加入waitbar,並在waitbar上添加‘取消’按鈕

有一個循環用來採集數據的,想加入一個waitbar並且在waitbar上加入按鈕,在取消的同時中止循環不知怎麼能實現。

stop=false;

h = waitbar(0.0,'Please wait...','CreateCancelBtn','stop=true; delete(h); clear h');

set(h,'Name','optional window name');

for i=1:1000

waitbar(i/1000,h,['Update ' num2str(i)]);

if stop

    break;

end

% do stuff

end

 

效果如下:

 

 

另:waitbar的closeFcn如何設置

對循環過程加了一個waitbar同時加了一個Cancel按鈕這個按鈕可以中止循環但是要是在waitbar上點擊關閉按鈕,卻會出現沒有找到closeFcn的錯誤。想加closeFcn並且讓他和cancel按鈕起一樣的作用這個怎麼實現?

解決方法:

需要的功能是通過CloseRequestFcn 實現的,因爲每次執行(點X)這個動作,系統是執行了CloseRequestFcn 。在你的m文件裏,覆蓋(override)這個函數就可以。
Help文檔裏,有這方面的例子。
比如說,當用戶 點 X, 你可以彈出一個對話框,確認是不是要關閉,你可以定義一個函數,my_closereq:
% my_closereq 
% User-defined close request function
% to display a question dialog box

selection = questdlg('Close Specified Figure?',...
                     'Close Request Function',...
                     'Yes','No','Yes');
switch selection,
   case 'Yes',
     delete(gcf)
   case 'No'
     return
end
然後,在系統初始階段,加上:
set(figure_handle,'CloseRequestFcn','my_closereq')
所以,只要修改my_closereq,符合自己的要求就可以了。

15、在matlab中對信號進行FFT變換

1. % --- Executes on button press in fft.

2. function fft_Callback(hObject, eventdata, handles)

3. global pathname filename sf nfft outfile H1 H2;

4. fid=fopen([pathname filename],'r');

5. x=fscanf(fid,'%f',[1,inf]);             %按行讀入原始信號數據

6. %FFT變換

7. nt=length(x);

8. h=findobj('Tag','cypl');

9. sf=str2double(get(h,'string'));

10. h=findobj('Tag','nfftcd');

11. nfft=str2double(get(h,'string'));

12. y=fft(x);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

13. %繪製輸入曲線圖形

14. t=0:1/sf:100/sf;

15. plot(H1,t,x(1:101));

16. xlabel('時間(s)');

17. ylabel('幅值');

18. title('輸入數據的時程曲線圖')

19. grid on;

20. %繪製幅頻曲線圖

21. f=0:sf/nfft:(nt-1)*sf/nfft;

22. plot(H2,f,abs(y));

23. axis([0,(nt-1)*sf/(nfft*2),3*min(y)/2,3*max(y)/2])

24. xlabel('頻率(Hz)');

25. ylabel('幅值');

26. title('信號頻譜圖');

27. outfile=y;

28. grid on

29. %grid on;

30. %h = findobj('tag',axes1)

31. % hObject    handle to fft (see GCBO)

32. % eventdata  reserved - to be defined in a future version of MATLAB

33. % handles    structure with handles and user data (see GUIDATA)

16、動態顯示figure中曲線的x-y座標值的一個函數

   函數定義如下所示。

   使用方法爲:

 

figure(1);

subplot(211), hline = plot(sin(1:10));

subplot(212), plot(sin(1:100));

dynpoint(hline);%調用函數時把hline句柄值傳給函數

 

界面:

 

==========================================================

function dynpoint(arg,h)

% Show the coordinates of a plot dynamically

%

% To start use:

% dynpoint(h)

% where h is a handle to a figure, axes or e.g. line.

%

% To delete use:

% dynpoint('delete',h)

% where h is a handle to a figure, axes or e.g. line.

% (you may also use: dynpoint delete)

%

% There can only be one dynamic plotter in a figure at a time.

%

% Example:

% subplot(211), hline = plot(sin(1:10))

% subplot(212), plot(sin(1:100))

% dynpoint(hline)

 

% 2002,6.29

 

if ~exist('arg','var')

arg = gcf;

end

 

if ~isstr(arg)

handle = arg;

arg = 'init';

end

 

switch arg

case 'init'

if ~ishandle(handle)

error('h is not a handle')

end

 

[h,ax] = h2hax(handle);

 

% delete old dynamic text object

ht = findobj(h,'tag',[mfilename '_text']);

if any(ht)

delete(ht)

end

 

% text window at the bottom left corner

% text in centred

uicontrol(h,...

'style','text',...

'pos',[10 10 100 40],...

'tag',[mfilename '_text'],...

'userdata',ax(1))

 

% do the dynamic thing...

set(h,'windowbuttonmotionfcn',[mfilename ' move'])

 

case 'move'

ht = findobj(gcbf,'tag',[mfilename '_text']);

ax = overobj('axes');

if ~any(ax)

ax = get(ht,'userdata');

end

p = get(ax,'currentpoint');

set(ht,'string',sprintf('%g %g', p(1),p(3)));

 

case 'delete'

if ~exist('h','var')

h = gcf;

end

[h,ax] = h2hax(h);

set(h,'windowbuttonmotionfcn','')

 

ht = findobj(h,'tag',[mfilename '_text']);

delete(ht)

 

end

 

% ----------

function [h,ax]=h2hax(handle)

 

typ = get(handle,'type');

if strcmp(typ,'figure')

h = handle;

ax = findobj(h,'type','axes');

elseif strcmp(typ, 'axes')

h = get(handle,'parent');

ax = handle;

elseif strcmp( get(get(handle,'parent'), 'type'), 'axes' )

ax = get(handle,'parent');

h = get(ax,'parent');

end

=========================================================

17、在GUI界面的打開按鈕中,如何對文件進行操作

我要的數據是保存在一組具有相同前綴名*.dat,*.atr,*.hea中的。只有3個同時被使用,數據才能起作用。

我想做一個的界面,一個最基本的功能就是“打開”按鈕,它的作用是打開*.dat文件,並匹配和*.dat具有相同文件名的另外兩個文件:*.atr,*.hea。實際上就是我表面上只是打開了那個*.dat文件,但程序會搜索和*.dat具有相同文件名的另外兩個文件:*.atr,*.hea,一起打開,並把它們保存在3個變量裏。

現在的困難是如何在同一個文件夾裏搜索到另外兩個文件?

解決方法:

1、給你個例子:
fileDir='C:\Users\liuhuanjin\Documents\MATLAB';
fileName='mydata.dat';
files = dir(fileDir); %列出文件夾中的所有文件,保存到files結構中 
for i=1:length(files) 
    if (strcmp(files(i).name,fileName)==1)  % 查找想要的文件
        fullFileName=[fileDir '\' fileName];
        disp('Find the file!');
        return
    end;
end;
disp('Can not find such file');

2、%2.打開圖片 
[filename,pathname]=uigetfile(...
    {'*.bmp;*.jpg;*.png;*.jpeg;*.tif','文件類型(*.bmp,*.jpg,*.png,*.jpeg,*.tif)';...
    '*.*',      '所有文件(*.*)'},...
    'Pick an image');
axes(handles.axes1);%用axes命令設定當前操作的座標軸爲axes1;
fpath=[pathname filename];%將文件名和目錄名組成一個完整的路徑;
I=imread(fpath);imshow(I);%用imread讀入圖片保存變量爲I,並且imshow在axes1軸上顯示
set(handles.getcurrentpoint_pushbutton,'Enable','on');%使其在打開命令使用後可使用,放在打開函數最後。
%3.讀取在上面打開圖片目錄下的txt文件內容。 
file=ls([pathname, '\*.txt']);%文件名
for i = 1 : size(file, 1)
    filepath{i} = strcat(pathname, '\', file(i, :));
    %合併路徑及文件名
end
for m = 1 : length(filepath)
    a=importdata(filepath{i},'\t');
     for i=1:(size(a,1)-2)
a{i}(~((a{i}>='0' & a{i}<='9') | a{i}=='.'|a{i}=='-'|a{i}==':'))=' ';
end

3、

[filename1,pathname]=uigetfile(...
    {'*.dat','Data Files(*.dat)';...
    '*.*','All Files(*.*)'},...
    'Pick an dat');
name=filename1(1:end-4);
filename2=[name,'*.atr'];
filename2=[name,'*.hea'];
data1=load([pathname,filename1]);
data2=load([pathname,filename2]);
data3=load([pathname,filename3]);
這樣就可以了,剩下的你自己寫

18、Matlab不同控件之間的數據傳遞問題

本人做了一4個button用於打開4個矩陣文件,第五個button用於把前四個button的數據寫到一個矩陣中去。本人想實現若只輸入前3個button的數據,第4個button不導入任何數據,如何實現第5個button能把前3個button的數據也寫到一個矩陣中去。以下是本人編的的條件語句,不好使啊!說明一下數據傳遞用的guidata型。

a=handles.a;

b=handles.b;

c=handles.c;

d=handles.d;

if isempty(d)

  A=[a b c];

else

A=[a b c d];

解決方法:

按照你的描述,我編了個程序,可以實現你所說的功能。

首先在Openingfcn中初始化矩陣d爲空矩陣;

然後在各按鈕的回調函數中加入形如如下格式的語句:

           handles.a=rand(3,3); % 隨機生成3*3矩陣做測試

           guidata(hObject,handles);

最後在第5個按鈕的回調函數內加入如下代碼:

a=handles.a;

b=handles.b;

c=handles.c;

d=handles.d;

if isempty(d)

A=[a b c];

else

A=[a b c d];

end

當不按按鈕5時,d爲空矩陣,則輸出前三個矩陣;當按了按鈕5時,d被賦值,不爲空,則輸出a,b,c,d四個矩陣。

19、在edit box裏輸入相關數據後,直接按回車鍵,不用鼠標點擊pushbutton 就可以直接執行

請教:讓push button執行一個程序的simulation, 在界面得所有edit box裏輸入相關數據後,想要直接按回車鍵 不用鼠標點擊pushbutton 就可以直接執行, 該怎麼編輯push button的callback呀

解決方法:

(1)設置控件的tab order。程序運行後,用tab鍵選定pushbutton,直接按"空格鍵"不用點擊pushbutton就可以;

(2)在最後的edit控件的callback函數內加入執行simulation的命令,最後的edit控件輸入完成後直接按'回車鍵'就可以運行simulation;或者調用button按鈕的callback也行。

(3)在KeypressFcn函數內加入相應的命令。這個方法還是需要在edit內輸入完數據後,在figure的空白處點一下鼠標,然後按鍵盤的任意鍵才行。

       根據你的意思,你是不想用鼠標點button按鈕,按enter就執行button內的代碼,那第(2)種方法是可行的。以上方法經實際測試,均是可行的!

19-1 GUI使用editbox輸入數據後如何自動清除數據

我編了一個GUI, 使用的時候會需要輸入一些數據, 我放了一個editbox和一個按鈕"Enter", 用的時候就是在editbox裏面輸入數據, 然後按"Enter"確認. 現在問題就是輸入好數據,按了Enter之後, editbox裏面的數據還在, 下次再輸入的時候就要先刪除後再輸入, 我想問一下有沒有什麼辦法能夠讓按了Enter鍵之後, editbox裏面的數據就會清除掉, 這樣下次再輸入的時候就不用先刪除了。

在enter按鈕的回調函數里加入如下代碼處理即可:
value1=get(handles.edit1,'string');%先取得編輯框的數據
set(handles.edit1,'string','');%再把編輯框清空

20、在GUI中,計算結果怎麼用excel來保存到指定的文件夾中

問題:GUI設計的結果怎麼用EXCEL來保存到指定的文件夾。

說明:根據論壇上的例子做了個GUI界面,結果可以保存到EXCEL裏面,但保存的路徑只能是在當前文件夾,我希望保存到指定的文件夾,怎樣才能把數據結果以EXCEL表格的形式保存到指定的文件夾?高手指點一下,不勝感激。。。

解決方法:

例如:要把‘第一行’、‘第二行’、‘第三行’分別添加到excel表格的三列可開頭,用以下命令:

M={‘第一行’,’ 第二行’,’ 第三行’};%定義爲cell類型

xlswrite(‘myexcel.xls’,M);

結果:

1

a=get(handles.edit1,'string');
b=get(handles.edit2,'string');
m={a;b};
[filename, pathname] = uiputfile('*.xls', '保存計算結果');
if filename==0 % 取消
return;
end
oldpath=cd;
cd(pathname);
[pathstr,filename]=fileparts(filename);
xlswrite(filename,{'X取值:'},'sheet1','A1');
xlswrite(filename,{'y=x^3+x^2+x的結果:'},'sheet1','A2');
xlswrite(filename,m,'sheet1','B1:B2');
cd(oldpath);

2、

a=get(handles.edit1,'string');
b=get(handles.edit2,'string');
m={a;b};
[filename, pathname] = uiputfile('*.xls', '保存計算結果');
if filename==0 % 取消
    return;
end
[pathstr,filename]=fileparts(filename);
xlswrite(filename,{'X取值:'},'sheet1','A1');
xlswrite(filename,{'y=x^3+x^2+x的結果:'},'sheet1','A2');
xlswrite(filename,m,'sheet1','B1:B2');

21、如何得到popupmenu選項中最後一個字符串的VALUE值

在popupmenu下拉菜單中有許多行內容,如何得到最後一行的value值?

解決方法:

在popupmenu的回調函數中加入代碼如下:

function popupmenu1_Callback(hObject, eventdata, handles)
list_menu=get(handles.popupmenu1,'String'); %先得到存放菜單項的cell列表
string=list_menu{end}; %得到最後菜單項的字符串
value=length(list_menu);%得到最後菜單項的Value值
disp(value);

或者用以下代碼:

str=get(handles.popupmenu1,'string');
s=str(end)   %最後一行內容
val=size(str,1)  %最後一行所處行數

22、回調函數互相調用的問題

想在一個按鈕的回調函數下運行另一個回調函數,句子該如何寫?

就像如下調用就可以。回調函數沒有什麼特別的,也是普通的函數,只不過它是響應控件的操作的。

解決方法:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to mybutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
    pushbutton2_Callback(hObject, eventdata, handles);

 

% --- Executes during object creation, after setting all properties.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to mybutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

22-2string和number相互轉換的問題

t2_1=get(handles.edit_t21,'String')
t2_2=get(handles.edit_t22,'String')
ua=get(handles.edit_ua,'String')
phi=get(handles.edit_phi,'String')
a_bmax=phi*9.8
s_zhidong=(t2_1+t2_2/2)*ua/3.6+ua^2/25.92/a_bmax

set(handles.text_zhidongjuli,'String',num2str(s_zhidong));

問題出現在:

a_bmax=phi*9.8這句不對,因爲phi=get(handles.edit_phi,'String')是從edit控件中返回字符串,必須用str2double或str2num轉換爲數字類型後才能使用。

23、這樣的功能的pushbutton的callback怎麼寫呀,謝謝了

pushbutton實現下面的功能:
先判斷edit(3個)是不是爲空,接着讀取popupmenu中的信息(2個選項),當兩者都符合要求的時候執行相關的命令這樣的pushbutton的callback怎麼寫呀,我寫的
a=get(handles.edit1,'string');

b=get(handles.edit2,'string');

c=get(handles.edit3,'string');

if isempty(a) || isempty(b) || isempty(c)

   warndlg('編輯框爲空!')

else

% 運行下面的代碼

end

解決方法:

a=get(handles.edit1,'string');

b=get(handles.edit2,'string');

c=get(handles.edit3,'string');

val1=get(handles.popupmenu1,'Value');

str1=get(handles.popupmenu1,'String');

switch str1{val1}

case 'string1'

        if isempty(a) || isempty(b) || isempty(c)

            warndlg('編輯框爲空!')

 else

         % 運行下面的代碼

end

case 'string2'

      % 同上

end

24、GUI中axes使用subplot時的清空及axes大小的固定的解決方法

看到過好幾個類似下面問題的帖子:
1、axes顯示圖片時隨着圖片的大小變化,如何固定axes顯示圖片大小;
2、當在axes使用subplot畫多個圖時,如何清空圖片,達到可以重複繪製圖片的目的;昨天又遇到了http://www.ilovematlab.cn/thread-47629-1-1.html 
動手做了一個例子驗證了一下,得出解決方法。
第一個問題很簡單,把axes放到一個panel面板中即可;
第二個問題稍微麻煩點,有人可能會說用cla/cla reset,這個時候cla/cla reset只能清除最後一個subplot對應的圖,其他的不能清除,舉個例子說一下解決方法:%畫圖程序:

代碼:

h1=subplot(121);    %記下句柄h1 
x=imread('football.jpg'); 
imshow(x); 
h2=subplot(122);    %記下句柄h2 
y=imread('arms.jpg'); 
imshow(y);

%清空圖像

代碼:

global h1 h2; 
h=0; 
if ishandle(h1)   %判斷h1是不是一個句柄 
    delete(h1);h=1; 
end 
if ishandle(h2)  %判斷h2是不是一個句柄 
    delete(h2);h=1; 
end 
if h 
    axes('parent',handles.uipanel1)  %重建一個axes 
end

 

25、退出GUI時如何把全局變量中的值清空?

我定義了一個global img=imread('x.bmp');一些處理img的程序。但是我退出界面程序時 再進入程序時img還是最後處理後的圖像,怎麼在退出程序時把img清空呢?

clear all;

26、從串口接受數據時,如何把波形繪製到指定的座標軸上?

在GUI做了一個有三個座標軸的界面,用於顯示從串口接收到的數據。
串口設置如下:

g = serial('COM1') ;

g.InputBufferSize= 4096;

g.OutputBufferSize= 4000;

g.BaudRate= 9600;

g.BytesAvailableFcnMode = 'byte'; %中斷觸發事件爲’bytes-available Event’?

g.BytesAvailableFcnCount = 45; %接收緩衝區每收到45 個字節時, 觸發回調函數

g.BytesAvailableFcn = @instrcallback; %得到回調函數句柄

回調函數instrcallback的繪製波形部分程序如下:

t =1:1:4;

axes(Ch1_Dis);  %Ch1_Dis爲座標軸1句柄

hold on

plot(t,ch1);

axes(Ch2_Dis);   %Ch2_Dis爲座標軸2句柄

hold on

plot(t,ch2);

axes(Ch3_Dis);   %Ch3_Dis爲座標軸3句柄

hold on

plot(t,ch3);

但是每次通過串口觸發回調函數instrcallback時,執行到plot指令都會另建一窗口figure1,將波形繪製到另建的窗口中。

當我不通過串口觸發回調函數,而是在一按鈕的回調函數中調用instrcallback時,就會把波形繪製到指定座標軸中。

解決辦法:

將程序改爲:
plot(t,ch1,'parent',Ch1_Dis);
plot(t,ch2,'parent',Ch2_Dis);
plot(t,ch3,'parent',Ch3_Dis);

可是我不明白爲什麼以前用axes設置當前座標軸不行,爲什麼在串口和定時器的回調函數中plot就不能在當前的座標軸中繪圖了,而用在其它函數就行!

問題的癥結所在:matlab自身的原因

figure 的handlevisibility屬性設置的問題,缺省爲callback。要顯性地改爲visibile。就可以了。否則,在定時器或串口的回調函數裏繪圖都會出現這種情況。

27、兩個GUI之間如何傳遞數據

想做一個兩個GUI界面的鑲套 假如說 我建立一個GUI界面 繪製一個圖形 然後需要在這個GUI界面的菜單裏面加入一個按鈕 這個按鈕的作用是設置繪製這個圖形的參數 就需要再打開一個GUI界面和我的主界面進行關聯 請問這需要怎麼實現?

解決方法:

以下介紹幾種Callback之間最爲常用的數據傳遞方式:
1.宣告爲全域變量 
   將欲傳遞的變量在傳遞雙方的Callback位置中都設爲全域變量,就可以在任一方的Callback中調用。
使用說明:global傳遞變量的方式爲當前有一組運算數據A必須在Tag名稱爲Pushbutton1與Pushbutton2所對應的對象Callback中使用,因此必須在雙方的Callback中都設置這個數據A爲全域變量。這樣通過全域變量的宣告,數據A就可以跨越Pushbutton1與Pushbutton2這兩個Callback的變量了。
2.應用對象的UserData屬性 
直接通過對象的UserData屬性來進行各個Callback之間的數據存取操作。首先必須先將數據存儲到一個特定的對象中,假設該對象的句柄值爲ui_handle,需要存儲的值爲Value,則輸入以下程序:
>>set('ui_handle','UserData','

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