版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:Matlab中TCP通讯-实现外部程序提供优化目标函数解     本文地址:http://techieliang.com/2017/12/551/
文章目录

  • 1. 介绍
  • 2. TCP使用方法
  •  2.1. 创建tcp
  •  2.2. 开启tcp
  •  2.3. 关闭tcp
  •  2.4. 收发
  • 3. 其他
  •  3.1. matlab发送回车,换行符的方法
  •  3.2. matlab字符串连接
  •  3.3. 接收数据为列向量,转行向量方法
  •  3.4. 字符串处理-替换
  •  3.5. 接收长度限制

1. 介绍

TCP如此常用的通讯功能,matlab自然也是支持的。而在用途方面也有很多,比如matlab优化问题中目标函数可以是其他程序的运算结果,此时需要动态的每次优化调用其他程序,这时可以使用tcp实现两程序之间的数据交互,由matlab的优化工具箱提供每次优化的设计变量值,有某程序提供基于设计变量得出的运算结果值作为目标函数的解。

2. TCP使用方法

Matlab 对TCP的封装很好,只有在建立和关闭tcp需要专用的函数,其他操作均与文件操作完全一致。

下面先给出一个用于优化的范例:

主脚本:

  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);

优化函数:

  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实现了阻塞,会不断的循环等待其他程序算出结果后成功接收到结果才完成单步优化计算。我设定了结果的固定表示格式

“mrXXXXXX###########@”消息总长度为20,末尾为@作为结束符,mr作为开头,XXXX为消息实际内容,#为占位符,以此方式保证每次发送消息均为20长度,同时可以通过数据头的mr确定收到的内容是不是传给matlab的结果文件(若多个tcp通讯需要做此判断防止发送错误,导致后续结果计算错误),只有当结果均计算正确,才目标函数返回值赋值为接收到的结果,并break进入下一次优化迭代

2.1. 创建tcp

tcpip()函数创建一个tcp对象,可以在matlab中用help tcpip查到帮助,上述范例为开启客户端。对于目标主机ip可以用’localhost’代替127

注意此函数第三项参数用来配置为服务端还是客户端,若不写默认为客户端

注意开启完成后的返回值一定要保存,后续开启、收发和关闭均需要使用,此处因为需要跨多个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通讯-实现外部程序提供优化目标函数解

转载于:https://www.cnblogs.com/techiel/p/7991890.html

Matlab中TCP通讯-实现外部程序提供优化目标函数解相关推荐

  1. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  2. matlab中存档算法代码,Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  3. matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。

    微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识 觉得文章有用,请戳底部[好看]支持 算法概述 基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究 ...

  4. matlab中增大迭代次数,贝叶斯优化matlab

    当我们遇到的一个最优化问题,但是目标函数不知道,或者说目标函数是类似于黑盒子,很难用数学公式/程序写出来时,此时想要求得目标函数的极值,可以使用贝叶斯优化,其主要的适用的情景是维数不超过20维,目标是 ...

  5. matlab中 mcc、mbuild和mex命令详解

    先简单的说说mcc.mbuild和mex到底怎么回事: mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex mex将C ...

  6. MATLAB中FIR滤波器的时延溢出问题详解:线性相位对信号造成的时延溢出及其消除方法,以及fir1等函数的使用

    1.问题由来: 前段时间在对用MATLAB处理试验数据时,需要对多路信号进行滤波后做同步,在这个过程中使用MATLAB中自带的 fir1 函数以及Filter Designer工具箱(FDATool) ...

  7. MATLAB中果蝇味道浓度判定函数,果蝇优化算法的加权策略研究

    摘  要: 针对基本果蝇优化算法(FOA)收敛速度慢和寻优精度不高的缺点,在位置更新公式中引入加权因子,提出了基于线性递减策略和先增后减策略的两种加权果蝇优化算法(WFOA),从而增强了种群的多样性. ...

  8. MATLAB中果蝇味道浓度判定函数,果蝇优化算法MATLAB实现

    果蝇优化算法MATLAB实现 发布时间:2018-10-12 23:28, 浏览次数:1183 , 标签: MATLAB 果蝇优化算法--Matlab实现 1果蝇优化算法原理介绍 果蝇是一种广泛存在于 ...

  9. matlab中globalsearch,MATLAB中fmincon和globalsearch、multistart优化问题

    本帖最后由 wwwjjj7008 于 2018-3-21 10:24 编辑 问题描述:从四个参数的给定范围r1[200 300].r2[50 100].l1[150 200].l2[150 250]中 ...

  10. MATLAB中果蝇味道浓度判定函数,果蝇优化算法

    1.随机初始果蝇群体位置. X_axis=10*rand(); Y_axis=10*rand(); 2.附与果蝇个体利用嗅觉搜寻食物之随机方向与距离. X(i)=X_axis+2*rand()-1; ...

最新文章

  1. 淘宝宝贝浏览量提升刷新工具 - 最好的淘宝宝贝流量提升工具
  2. Sublime text 2/3 中 Package Control 的安装与使用方法
  3. 18.DataGrid内绑定ComboBox和ListBox以及取值
  4. matlab unique函数
  5. java 字节缓冲_Java字节缓冲流原理与用法详解
  6. IT工程师必备的认证
  7. 用ASP.NET 重绘TabControl代码
  8. 微软认真聆听了开源 .NET 开发社区的炮轰: 通过CLI 支持 Hot Reload 功能
  9. 学数学但是不会计算机,数学差的人不配学计算机?布朗大学教授告诉你一毛钱关系都没有!...
  10. Silverlight 2应用程序中XAP文件揭秘
  11. Unity3dRPG 相机跟随player旋转_【Cinemachine】VirtualCamera虚拟相机详解(一)
  12. idea 和tomcat 中文乱码问题
  13. 【腾讯云】记录一次Could not connect to SMTP host: smtp.163.com, port: 25的解决办法
  14. labview自动保存报表_Labview如何快速保存数据到Excel
  15. 室内定位程序_如何设计室内AR导航系统?
  16. 树莓派的linux操作系统,树莓派的6种轻量级操作系统介绍
  17. 用endnote x9在Word 2016中插入参考文献到特定位置
  18. 红米1S联通版_标注:2013029_官方线刷包_救砖包_解账户锁
  19. 高中数学一对一培训高中数学必修一知识点总结
  20. IQ 智力题 有答案

热门文章

  1. 阿里巴巴为什么要禁用Executors创建线程池?
  2. 阿里首席架构师分享的Java工程师职业规划
  3. 华为将发布“鸿蒙”以取代 Android 系统
  4. 这些小工具让你的Android开发更高效
  5. 如何更高效地使用 OkHttp
  6. netty与socket对比_Netty之WebSocket和四种IO介绍
  7. win10休眠_这样设置以后,WIN10比WIN7运行更流畅
  8. RESTful风格编程
  9. @SuppressLint(HandlerLeak),或Handler使用有警告;
  10. 【自动化__持续集成】___java___代码非空指针