TCP如此經常使用的通信功能,matlab天然也是支持的。而在用途方面也有不少,好比matlab優化問題中目標函數能夠是其餘程序的運算結果,此時須要動態的每次優化調用其餘程序,這時可使用tcp實現兩程序之間的數據交互,由matlab的優化工具箱提供每次優化的設計變量值,有某程序提供基於設計變量得出的運算結果值做爲目標函數的解。linux
Matlab 對TCP的封裝很好,只有在創建和關閉tcp須要專用的函數,其餘操做均與文件操做徹底一致。算法
下面先給出一個用於優化的範例:windows
主腳本:數組
優化函數:app
此範例的優化函數中利用一個while 1實現了阻塞,會不斷的循環等待其餘程序算出結果後成功接收到結果才完成單步優化計算。我設定告終果的固定表示格式tcp
「mrXXXXXX###########@」消息總長度爲20,末尾爲@做爲結束符,mr做爲開頭,XXXX爲消息實際內容,#爲佔位符,以此方式保證每次發送消息均爲20長度,同時能夠經過數據頭的mr肯定收到的內容是否是傳給matlab的結果文件(若多個tcp通信須要作此判斷防止發送錯誤,致使後續結果計算錯誤),只有當結果均計算正確,才目標函數返回值賦值爲接收到的結果,並break進入下一次優化迭代函數
tcpip()函數建立一個tcp對象,能夠在matlab中用help tcpip查到幫助,上述範例爲開啓客戶端。對於目標主機ip能夠用’localhost’代替127工具
注意此函數第三項參數用來配置爲服務端仍是客戶端,若不寫默認爲客戶端post
注意開啓完成後的返回值必定要保存,後續開啓、收發和關閉均須要使用,此處由於須要跨多個m文件使用此tcp因此設置爲了全局變量優化
fopen便可,參數傳入tcp對象
fclose? 就能夠關閉一個已經開啓的tcp了,參數傳入tcp對象
建議用delete釋放tcp對象的內容
啓動tcp之後,matlab支持直接用文件讀寫的方式進行tcp消息收發,直接使用fwrite、fread便可,第一個參數要傳入開啓tcp對象
matlab不支持在字符串中用\n實現換行,可是能夠直接發送對應ASCII碼,能夠經過char(13), char(10)實現換行的發送,注意這兩個對應的是\r\n,windows中是用\r\n實現換行,若linux直接發送\n的10便可。
很簡單[send_text,num2str(x(i),’%.4f’),char(13), char(10)],直接用行向量數組便可,自己matlab就是用char數組表示字符串的
直接text=text’;便可,和矩陣操做同樣
別用string()去強制字符串,matlab中自己就是用char數組表示字符串,沒有單獨的字符串概念,轉換完也沒區別
text = strrep(text,’@’,」);實現了吧text中的全部@刪除,上述範例是由於發送來的數據是固定的格式,對格式作預處理
因爲matlab接收tcp消息是按照固定長度,因此發送端若發送的內容不夠長,能夠在後面加佔位符,matlab接收到之後刪除佔位符便可
A = fread(mtcpip, 20);
此函數指定了接收的長度,若消息發送的長度不夠,會一直阻塞,直到超時之後纔會接收已有的爲知足長度要求的數據,爲了保證當即接收,建議發送數據末尾用佔位符,接收到之後再替換掉。