2017年,我與MATLAB的八件小事
每逢年末,難免會有些感慨,2017年的元旦猶如昨日,眼下卻即將步入2018年。
仍舊記得5月份寫的一篇帖子,題為「你是否有五年來一直堅持的事?」,帖子的最末,多半期待,些許承諾。如今作為回復,對半年前的程序員應一聲:「Hey,真好,我還在」
過往沒有寫日記亦或是總結的習慣,忽然某一天開始寫起了公眾號,難免忍不住在年末這麼有儀式感的日子裡去回顧這一年的點點滴滴。願與你分享,2017年,我與Matlab的八件小事。
01 關於公眾號
2017年3月14日,我註冊了微信公眾號,起名為「打浦橋程序員」,只關於Matlab。
創建公眾號的初衷很簡單,在平時工作過程中會遇見形形色色的問題或是繁瑣的重複性任務,在解決問題之初,我也在網上搜尋了答案很久,但是時常不能當下就找到相應的答案。
我相信,這些問題都是冷門小眾的問題,不見得每個人都會遇上。而每個遇上這些問題的人,在解決以後,似乎也沒有興緻記錄下解決問題的思路。
每篇我所記錄的問題,倘若有一天,你也碰到了,而我所聊的邏輯,恰好也給了你一點點啟發,讓你在解決問題的道路上,少走一些彎路,少花一些時間,那就是我的幸運,也是打浦橋程序員公眾號存在的意義。
而在這一年當中,公眾號從最初的50人親友關注量,到現在2110人關注,一共發帖43篇,總計18509人閱讀,閱讀量為54306次,其中閱讀量最高的帖子是「如何自學Matlab」,閱讀量為1954次。
雖然算不得成功,不過對我而言實實在在是一件實現自我突破的事。同時也謝謝大家的關注與支持。
02 關於網路爬蟲
2017年4月9日,我寫了一篇關於爬蟲的帖子「Matlab還能看得懂上海房價?」而這也是我第一次嘗試用Matlab去實現網路爬蟲。
看著命令窗口中一條一條彈出數據爬取成功的提示,即便是在現在看來十分暴力生澀的代碼,當下的成就感旁人自然是無法理解。
對於Matlab網路爬蟲而言,最基本的,不外乎三點:
- 網址的分析
- 網頁源代碼的分析
- 乃至最終通過正則法去提取目標數據
不過即便不是專註於網路爬蟲,上述的三點都可以認為是數據分析不可或缺的基本功,並且不單單只是說能夠通過看工具書就能習得,需要通過些許例子加強練習。
在上海房價的爬蟲之後,陸陸續續我又寫了幾篇關於網路爬蟲的帖子:
- 通過Matlab來聊聊上海租房的那些事
- 為什麼說Matlab不適合網路爬蟲
- 知乎er,你們了解自己的關注者么?
就技術上而言,與上海房價的爬蟲相比,代碼邏輯並沒有特別突出的創新點,純粹的換湯不換藥。
而真正進行改進的,是關於反爬蟲機制的應對。Matlab應對反爬蟲的策略有很多,包括使用代理器,修改IP地址進行網頁讀取。
在最近的那篇爬蟲帖中,我舉例了一種最簡單的策略,通俗的講就是,網站不讓我讀取信息,那我就等,直到網站再次許可我讀取信息為止。如果網站識別到位機器讀取的話,urlread有效值的輸出依舊為1,是有效讀取網頁的動作,不過輸出的網頁字元串信息無效,其中並沒有包含你所需要的信息。對此不妨使用while循環,如果網頁信息中始終包含「Unhuman」該關鍵詞,那麼進行重新讀取,直到讀取到真正有效的網頁信息。
同時嘗試變頻讀取。所謂變頻讀取,就是不要以等時長形式進行讀取或者是不間斷進行讀取,對時間間隔稍加修飾。對於時間間隔的命令,很容易就能聯想到pause的函數。而變頻的話,可以考慮對時長進行隨機選取,而隨機數的選取就可以考慮使用rand函數。
這種策略的一個弊端就是,耗時相對比較長,從技術層面上而言,屬於無腦爬蟲,技術相對較低。但是如果不考慮時間成本的話,這種方法是可以滿足自身需求的。讓Matlab一直運算,直到爬完所有信息。
03 自動生成Word文檔
2017年3月24日,我發了一篇關於產品評估工具的帖子,由於涉及到工作內容,不得不以股票為例子,重新寫了一個工具,「【一個被斃掉的作品】如何評估一隻股票的買點」。
這篇帖子中,最為吸引我的一點功能是能夠自動生成Word報告。
正如帖子的題目所言,這個工具也僅僅只是存活了一個星期。而當初所有的不愉快,甚至是因為不受尊重而產生的憤怒,如今看來也只是過眼雲煙。相反,我感謝能有這樣一次機會,讓我有一個禮拜的時間去嘗試用自己的方式去寫一個工具,也收穫了許多意料之外的創意。
印象中很深的是,我花了很久的時間就在琢磨如何在Word文檔中插入所截取的圖片。直到某一天晚上在單位加班到9點多,突然襲來的靈感解決了這個問題,一時興奮的卻無人分享。
對於這個問題,Matlab中有個函數
invoke(Word.Selection,Paste);
這個函數的作用就是,將剪切板中的內容粘貼到Word中。最初嘗試搜索Matlab有沒有自帶這種函數,能否將一個文件複製到剪切板中,但是我沒有找到答案。最終曲線救國的辦法是,我寫了vbs腳本對目標文件進行複製,然後通過Matlab的dos函數執行了這個vbs腳本。當插完圖片之後,就刪除這個vbs文件。
除此以外,在這個工具中還有不少有意思的點,比如如何在GUI工具界面畫雷達圖,如何通過參數的調節控制雷達圖的變化,等等。有興趣的朋友,不妨閱讀這篇帖子「【一個被斃掉的作品】如何評估一隻股票的買點」。
04 Matlab與Excel交互
2017年5月,我與媳婦前往摩洛哥度假,那是一段特別棒的旅程,也是我發帖較為頻繁的一段時光。在卡薩布蘭卡的海灘,我收穫了一張迄今為止最為喜愛的照片。
閑暇之餘的創意,想把這張照片以單元格塗色的形式錄入到excel中,於是就寫下了第一篇關於Matlab與Excel交互的帖子「如何在excel中畫畫」。
而在如今看來,這篇帖子對於目前的工作而言意義重大,於是在不久之前,憑著一直以來的工作感悟,發了一篇帖子「不擅長Excel宏的人」,以一個簡單的例子介紹Matlab與Excel的交互在平時工作中的應用。
對於這塊內容,處理起來並不難,整體過程大致是,先通過Excel.application對Excel進行定義,此後便依次對workbook,sheet,單元格進行處理。
而在對單元格進行處理的過程中,最常見的大致是以下幾種:
1. 設置單元格顏色
Sheet1.Range(cell).Interior.Color
2. 合併單元格
Sheet1.Range(cell).MergeCells = 1;
3. 水平居中
Sheet1.Range(cell).HorizontalAlignment = 3
4. 垂直居中
Sheet1.Range(cell).VerticalAlignment = -4108
5. 單元格寫入
Sheet1.Range(cell).value =Udc;
或許會有朋友心有疑問,不清楚如何獲取想要設定的參數名。在「如何在excel中畫畫」這篇帖子中,我介紹了整個Excel生成流程,以及通過設定單元格顏色的例子介紹了如何自己取摸索確定參數名。
05 Simulink建模工具
在很長一段時間內,Simulink建模工具應該是我最為喜愛的一個工具,沒有之一。產生開發這個工具的想法,源於2016年的一個項目。那時候,我還是一個軟體工程師。
那一年有兩個月,每天下班回家之後,我就坐在電腦前碼代碼,一碼就是到凌晨,周末也是如此。當時給自己開發了一個工具,算不上工作任務,也算不上業餘的愛好,僅僅只是工作上碰到了一個很繁瑣的任務,暢想著能通過代碼實現,好讓一個重複性任務變得更有吸引力。
整個工具成型之後,也慢慢會碰到其他訴求,業餘時間我也逐一為此開發功能,逐一加入到了這個工具之中。直至如今,這個工具雖然算不上完美,但好歹讓我想對模型大刀闊斧的改造時絲毫沒有些許畏懼。
這個工具中集成了許多平時在控制器軟體開發過程中所需的功能,將近35個不同的功能。其中最讓我有成就感的功能,莫過於一鍵替換參數名。
當然還包括Stateflow中參數名的替換
除此以外,還有其他有意思的功能,在「Matlab如何大規模修改Simulink模型」這篇帖子中都有動圖演示。
對於修改Simulink模型這種需求,關鍵的函數不外乎以下幾種:
1. 獲取參數
get_param()
2. 設置參數
set_param()
3. 新增模塊
add_block()
4. 新增連線
add_line()
等等
除此以外就是關於具體參數的設置了,包括name,position,value,inputs,outputs等等。而這些資料以及優秀的代碼在網上和論壇上都是有朋友討論的,最重要的還是在於對Simulink模型設計的理解。
06 截屏與屏幕錄製
2017年8月23日,我發了一篇關於Matlab截屏與屏幕錄製的帖子「Matlab如何實現截屏與屏幕錄製」。
寫這個工具的想法並不是一下子就成型的,是在5月份的時候,一位Matlab論壇里的朋友私信我說,他完成了數據分析並且通過plot函數以圖片的形式呈現了計算結果,不過他的導師希望能夠以一個動態圖的形式更直觀的理解整個變化過程。
最初對於這個需求,我挺有興趣,於是就著手寫了一個Matlab製作GIF動圖的工具,並在5月27日發了一篇帖子「Matlab如何動態呈現計算結果」。
而計算結果動態顯示的效果大致如下:
到了8月份,由於電腦中Screenpresson軟體的臨時故障導致不能錄製屏幕,於是我靈光一現,就打算自己寫一個Matlab錄製屏幕的工具。
在逛知乎的過程中,漸漸了解到,有個詞叫造輪子。用知乎網友@王子亭的話來說,造輪子就是,明知道你做的不可能比前輩做得更好,卻仍然堅持要做。而造輪子的意義在於,能夠增加自己的經驗,很多事情看起來很簡單,但只有自己動手,才會發現其中的難點。
如果對寫這兩個工具有興趣的朋友,會在之後動手過程中發現,碼其代碼來並不如看起來那麼容易,其中有幾個技術點挺有趣的,比如
- 如何實現截屏
- 如何確定錄屏區域
- 如何實現錄屏
- 如何實現錄屏的暫停與終止
尤其最後那個問題,是一個特別普通常見,但是在處理過程中需要花時間琢磨的點。有興趣的朋友,可以參考這篇帖子「Matlab如何實現截屏與屏幕錄製」。
07 提取曲線原數據
提取曲線原數據這個工具是我在5月份寫的另一個工具「Matlab如何從曲線圖中提取原始數據」。
那陣子跟朋友聊天,聊到一個問題,比較有意思,是關於獲取曲線圖中的數據。無論是在學習還是工作過程中,肯定會有那麼幾個時刻,比如看到了一張扭矩轉速圖或是電池特性圖,很想獲取這些曲線圖中的原始數據。
也正是源於這一次偶然的對話,我突然對提取曲線數據這個話題尤為感興趣。期間也在網上搜索過相關的處理方案,大多都是通過ginput多次描點最終提取曲線的。對於這種需要費時費力的解決方案,我並不贊同。於是就踏上自己琢磨的道路
事實上而言,這個工具被使用的次數並不多,主要原因在於處理對象的局限性,對於簡單的單實線圖,是能夠識別其中的數據,而當出現多曲線時,需要對曲線圖進行一個預處理。同時因為這個功能的需求並不迫切,因此也沒能再深入去優化這個工具。但是整體上而言,我還是特別喜歡這個工具的,因為在開發這個工具的過程中,應該是我第一次嘗試挑戰圖像處理。
08 滑鼠精靈
滑鼠精靈是2017年我完成的最後一個工具,而這個工具對我而言意義重大,因為滑鼠精靈的產生,對於Matlab所能夠實現的功能又增加了一個維度。而我也將再不用依賴於調用vbs腳本了。
開發這個工具的理由真的是太奇葩了,簡單的說,是因為我太懶了,不想在上班的時候,一次又一次的在登錄不同系統過程中去輸入相同的賬號和密碼。於是,在2017年的10月,這個工具誕生了「Matlab如何製作滑鼠精靈」。
其實在「Matlab如何製作滑鼠精靈」這篇帖子中所舉的使用例子並不具代表性,因為這種操蛋的煩惱不是每個人都能經歷的到的。而在這個月月初,我剛發的一個帖子中「Matlab如何獲取股票數據」,滑鼠精靈的作用就體現出來了。當使用yahoo讀取股票數據宕機的情況下,獲取直接通過同花順下載歷史數據是一個更為有效的辦法,畢竟用15秒來獲取上證幾十年的歷史數據,並不見得在效率上會敗給爬蟲式的讀數據法。
有心的朋友可能會發現,這一年來,我很大一部分時間是花在GUI工具開發上。在使用Matlab的過程中,於我而言,最迷人的一點莫過於GUI的開發,這不同於模擬,不同於圖像處理,或是其他,因為模擬的優化是無止盡的,沒有人敢斷言,老子的模型天下第一,沒有人的模型能比我的仿的更准了。這有點像一道語文閱讀理解,作者寫這句話是什麼用意。相比之下,工具開發更像一道數學題,答案是確定的,要麼能實現功能,要麼就是不能實現功能,而其中唯一的不同是,你是如何解這道題的,你又是如何實現這個功能的。
為此,我專門寫過一篇帖子是關於如何製作GUI工具的Matlab如何製作GUI。
如果有對GUI工具這一塊特別感興趣的朋友,不妨參考一下幾篇關於GUI的實例帖子:
- 【一個被斃掉的作品】如何評估一隻股票的買點
- Matlab如何動態呈現計算結果
- Matlab如何從曲線圖中提取原始數據
- Matlab如何大規模修改Simulink模型
- Matlab如何實現截屏與屏幕錄製
- Matlab如何製作屬於自己的縮寫詞典
- Matlab如何製作滑鼠精靈
感謝2017年3月的一時興起,慶幸因為這八件小事,而沒有自覺虛度了這一年。希望來年,你我都能進步,不必再為Matlab門外徘徊而苦惱。
朋友們,明年再會!
以上
如果你有興趣,歡迎關注我的微信公眾號「打浦橋程序員」,謝謝
推薦閱讀:
※[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(1)
※大表姐說:得旌旗者得天下(matlab畫圖機制)
※如何優雅地使用Matlab?
※MATLAB神經網路(六):GRNN
※MATLAB高級數據結構連載5: table 3