標籤:

Matlab如何動態呈現計算結果

不久前,有位論壇的朋友私信我說,他完成了數據分析並且通過plot函數以圖片的形式呈現了計算結果,不過他的導師希望能夠以一個動態圖的形式更直觀的理解整個變化過程。

最近一次偶然的需求,剛好完成了一段代碼,回想起之前與這位朋友的聊天,似乎一定程度上能夠實現他想要達到的效果。

今天就來聊一聊,Matlab如何動態呈現計算結果。如果有興趣或是恰好有這方面需求的朋友,可以一起來探討。

在寫如何在excel中畫畫的帖子中,我使用了一張動圖Gif,這張動圖是我在網上在線生成的,圖上的水印真是格外的顯眼。所以在寫那篇帖子的過程中,有那麼一瞬間,我就思考,Matlab是否能夠生成Gif動圖。

於是我就上網搜索這方面的帖子。網上在這方面的詳細例子,可以用來嘗試下,代碼就不複製別人的答案了,就分享一下我從中學到的一條代碼

imwrite(I,map,test.gif,gif,Loopcount,inf,DelayTime,0.5);

imwrite是圖像處理中,將圖像數據寫入到圖像文件中的一個函數,『I』, 『map』源於rgb2ind函數的計算結果,將真彩色圖像轉換為索引圖像。關於這個函數的詳細用法,可以在命令窗口輸入doc rgb2ind獲取幫助信息。『test.gif』是圖像文件的文件名,『gif』是圖像文件的文件類型,『Loopcount』用於循環次數的定義 ,『DelayTime』用於時間間隔的定義。

在了解了Gif製作這方面的基礎知識之後,就可以來著手開始DIY屬於自己的動圖製作工具了。

這是我通過Matlab GUI寫的一個動圖製作的小工具,其中所包含的基本功能有:

  • 載入圖片

  • 刪除圖片

  • 控制時間間隔

  • 生成Gif

  • 預覽Gif

接下來分享一下,這個工具的具體使用流程

1. 載入圖片

其中,通過uigetfile函數能夠實現文件選擇的功能

[filename, pathname] = uigetfile({*.*,},File Selector,MultiSelect, off);

為了更完善這個功能,可以定義,在未選擇文件的情況下,通過信息框進行提示

msgbox(no Picture selected);

2. 刪除圖片

如果載入圖片過程中,發現載入了錯誤的圖片,或者載入圖片的順序有誤,可以在這裡加入選擇性刪除的按鍵,實現的邏輯大致是:

1) 選取列表對象,也就是錯誤載入的圖片

2) 獲取列表控制項的Value和String

3) 刪除String中的目標名字,生成新的String並賦值給列表控制項

其中需要注意的是,完成刪除這個動作之後,需要將列表空間的Value置1,防止出現GUI界面的Bug。

3. 控制時間間隔

在控制時間間隔這個功能上,可以選擇使用輸入框(editbox)的形式對時間間隔進行定義。不過出於對界面美化的原因,我使用了滑塊控制項(slider)對時間間隔進行設置,同時由文本框控制項(text)實時顯示設置結果。

在控制項定義上,可以通過uicontrol函數來實現。

4. 生成Gif

點擊Gif生成按鈕之後,就會生成文件名以日期為導向的Gif文件。其中,通過date函數就能輸出數據類型為char的日期數據

5. 預覽Gif

這個按鈕能夠實現Matlab打開其他文件的功能,等效於滑鼠雙擊的效果。其中所涉及到的函數是winopen函數

winopen(File.gif);

除此以外,我還給我這個小工具的最底下增加了另一個按鈕

aHR0cDovL3dlaXhpbi5xcS5jb20vci9ZUzEzYjUzRTljQ0tyZGtNOTNoeg== (二維碼自動識別)

這個功能的實現,首先需要定義一個窗口,使用figure的函數,能夠定義窗體的大小,位置,標題,等等。然後通過imshow函數,就能顯示圖片。

同樣,也可以通過winopen直接打開這個圖片文件。

在完成整個小工具的製作之後,回過頭來看一下,那位朋友想要實現的效果如何通過這個工具來實現。

在這裡,做一個最簡單的假設,目標曲線如下:

其中,愛心曲線的作圖代碼如下,並非自創,摘自網路:

clear all;

clc;

figurex=-2:0.01:2;

y=sqrt(2*sqrt(x.^2)-x.^2);

plot(x,y,r);

hold on;

z=asin(abs(x)-1)-pi./2;

plot(x,z,r);

axis([-2,2,-3,1]);

然後通過saveas能夠將plot的作圖結果保存為圖片的格式

saveas(gcf,pic.jpg)

通過for循環能夠保存每一步的結算結果圖片,然後通過Gif製作工具。由於知乎無法顯示動圖,具體動圖效果顯示在我的公眾號中,截圖效果如下:

以上

如果你有興趣,可以關注我的微信公眾號「打浦橋程序員」,謝謝

推薦閱讀:

已知橢圓5個點,用數學軟體求橢圓周長?
matlab把日期轉換成數字以後輸出到csv文件,數字會四捨五入?
Matlab如何製作屬於自己的縮寫詞典
Matlab如何從曲線圖中提取原始數據

TAG:MATLAB |