Matlab中TCP通信-實現外部程序提供優化目標函數解

版權聲明:若無來源註明, Techie亮博客文章均爲原創。 轉載請以連接形式標明本文標題和地址:
本文標題:Matlab中TCP通信-實現外部程序提供優化目標函數解     本文地址: http://techieliang.com/2017/12/551/

1. 介紹

TCP如此經常使用的通信功能,matlab天然也是支持的。而在用途方面也有不少,好比matlab優化問題中目標函數能夠是其餘程序的運算結果,此時須要動態的每次優化調用其餘程序,這時可使用tcp實現兩程序之間的數據交互,由matlab的優化工具箱提供每次優化的設計變量值,有某程序提供基於設計變量得出的運算結果值做爲目標函數的解。linux

2. TCP使用方法

Matlab 對TCP的封裝很好,只有在創建和關閉tcp須要專用的函數,其餘操做均與文件操做徹底一致。算法

下面先給出一個用於優化的範例:windows

主腳本:數組

  1. clc;clear;
  2. %開啓tcp
  3. global mtcpip %用全局變量方便優化函數中使用tcp
  4. global circle_number
  5. circle_number=0;
  6. mtcpip=tcpip('127.0.0.1', 8000);
  7. fopen(mtcpip);
  8. fwrite(mtcpip,['Matlab Connect in',char(13), char(10)])
  9. %優化算法--
  10. current_value = [123123 123123 123123 123321 123123 123123 13 123123 123123];
  11. lb=[];
  12. ub=[];
  13. new_error = fmincon(@matlab_function,current_value,[],[],[],[],lb,ub);%優化
  14. % 優化技術-關閉tcp
  15. fwrite(mtcpip,['Matlab Disconnect',char(13), char(10)])
  16. fclose(mtcpip);
  17. delete(mtcpip);

優化函數:app

  1. function [ f ] = matlab_function( x )
  2. global mtcpip
  3. global circle_number
  4. circle_number=circle_number+1;
  5. x_size = size(x);
  6. send_text=['matlabvalue--'];
  7. for i=1:1:x_size(2)
  8. if i==x_size(2)
  9. send_text=[send_text,num2str(x(i),'%.4f'),char(13), char(10)];
  10. else
  11. send_text=[send_text,num2str(x(i),'%.4f'),';'];
  12. end
  13. end
  14. fwrite(mtcpip,send_text);
  15. while 1
  16. A = fread(mtcpip, 20);
  17. text = char(A);
  18. text_size = size(text);
  19. if text_size(1)<2
  20. continue;
  21. end
  22. if text(1) == 'm' && text(2) == 'r'
  23. text=text';
  24. text = strrep(text,'@','');//符號替換
  25. text = strrep(text,'mr','');
  26. text = strrep(text,'#','');//刪除末尾多餘的佔位符,我用#做爲佔位符了
  27. f = str2double(text);
  28. ['circle one begin',num2str(circle_number,'%.4f')]
  29. break;
  30. end
  31. end
  32. end

此範例的優化函數中利用一個while 1實現了阻塞,會不斷的循環等待其餘程序算出結果後成功接收到結果才完成單步優化計算。我設定告終果的固定表示格式tcp

「mrXXXXXX###########@」消息總長度爲20,末尾爲@做爲結束符,mr做爲開頭,XXXX爲消息實際內容,#爲佔位符,以此方式保證每次發送消息均爲20長度,同時能夠經過數據頭的mr肯定收到的內容是否是傳給matlab的結果文件(若多個tcp通信須要作此判斷防止發送錯誤,致使後續結果計算錯誤),只有當結果均計算正確,才目標函數返回值賦值爲接收到的結果,並break進入下一次優化迭代函數

2.1. 建立tcp

tcpip()函數建立一個tcp對象,能夠在matlab中用help tcpip查到幫助,上述範例爲開啓客戶端。對於目標主機ip能夠用’localhost’代替127工具

注意此函數第三項參數用來配置爲服務端仍是客戶端,若不寫默認爲客戶端post

注意開啓完成後的返回值必定要保存,後續開啓、收發和關閉均須要使用,此處由於須要跨多個m文件使用此tcp因此設置爲了全局變量優化

2.2. 開啓tcp

fopen便可,參數傳入tcp對象

2.3. 關閉tcp

fclose? 就能夠關閉一個已經開啓的tcp了,參數傳入tcp對象

建議用delete釋放tcp對象的內容

2.4. 收發

啓動tcp之後,matlab支持直接用文件讀寫的方式進行tcp消息收發,直接使用fwrite、fread便可,第一個參數要傳入開啓tcp對象

3. 其餘

3.1. matlab發送回車,換行符的方法

matlab不支持在字符串中用\n實現換行,可是能夠直接發送對應ASCII碼,能夠經過char(13), char(10)實現換行的發送,注意這兩個對應的是\r\n,windows中是用\r\n實現換行,若linux直接發送\n的10便可。

3.2. matlab字符串鏈接

很簡單[send_text,num2str(x(i),’%.4f’),char(13), char(10)],直接用行向量數組便可,自己matlab就是用char數組表示字符串的

3.3. 接收數據爲列向量,轉行向量方法

直接text=text’;便可,和矩陣操做同樣

別用string()去強制字符串,matlab中自己就是用char數組表示字符串,沒有單獨的字符串概念,轉換完也沒區別

3.4. 字符串處理-替換

text = strrep(text,’@’,」);實現了吧text中的全部@刪除,上述範例是由於發送來的數據是固定的格式,對格式作預處理

因爲matlab接收tcp消息是按照固定長度,因此發送端若發送的內容不夠長,能夠在後面加佔位符,matlab接收到之後刪除佔位符便可

3.5. 接收長度限制

A = fread(mtcpip, 20);

此函數指定了接收的長度,若消息發送的長度不夠,會一直阻塞,直到超時之後纔會接收已有的爲知足長度要求的數據,爲了保證當即接收,建議發送數據末尾用佔位符,接收到之後再替換掉。

轉載請以連接形式標明本文標題和地址: Techie亮博客 » Matlab中TCP通信-實現外部程序提供優化目標函數解
相關文章
相關標籤/搜索