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

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通讯-实现外部程序提供优化目标函数解

Matlab中TCP通讯-实现外部程序提供优化目标函数解的更多相关文章

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

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

  2. Linux系统网络编程中TCP通讯socket--send导致进程被关闭

    https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...

  3. C#中的TCP通讯与UDP通讯

    最近做了一个项目,主要是给Unity3D和实时数据库做通讯接口.虽然方案一直在变:从开始的UDP通讯变为TCP通讯,然后再变化为UDP通讯;然后通讯的对象又发生改变,由与数据库的驱动进行通讯(主动推送 ...

  4. async...await在tcp通讯中的正确用法

    引言 编程能力在不断的总结中进步以及成长,最近的半年里,对之前的开源项目代码进行回归,在重构的过程中进行了很多思考,很多次都想放弃重构,毕竟一个已经在使用的项目,重构基础代码就相当于重新开发了,不过最 ...

  5. 使用netty实现的tcp通讯中如何实现同步返回

    在netty实现的tcp通讯中,一切都是异步操作,这提高了系统性能,但是,有时候client需要同步等待消息返回,如何实现呢?笔者已经实现,在此总结下重点要素 实现要点: 1.消息结构设计 消息头中需 ...

  6. MATLAB中提供的线型属性

    MATLAB中提供的线型属性有: 线型 说明 标记符 说明 颜色 说明 - 实线(默认) + 加号符 r 红色 -- 双划线 o 空心圆 g 绿色 : 虚线 * 星号 b 蓝色 :. 点划线 . 实心 ...

  7. android tcp通讯

    Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是 ...

  8. .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)

    上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...

  9. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

随机推荐

  1. LFS搭建第一天

    1. 前期准备 vmware 软件安装 LFS iso 下载:http://ftp.osuosl.org/pub/lfs-livecd/lfslivecd-x86-6.3-r2145.iso 2.新建 ...

  2. Linux Mint 使用 VNC Server (x11vnc) 进行远程屏幕

    https://community.linuxmint.com/tutorial/view/2334 This tutorial was adapted from here. Remove the d ...

  3. 关于NODEJS性能测试和优缺点总结

    最近公司开发了一套新产品,采用nodejs前端+Java后端框架,为完全的前后端分离结构,以下为相关信息. 软件及功能: 软件 功能 Nginx 负责反向代理和负载均衡 Nodejs 前端代码 JDK ...

  4. svg vs canvas

    http://fabricjs.com/ https://github.com/ecomfe/zrender http://raphaeljs.com/

  5. Java程序设计 第16周 课堂实践 —— 数据库4

    Java程序设计 第16周 课堂实践 -- 数据库4 课堂实践任务4 查询world数据库,查询哪个国家的平均寿命最长. 代码分析 实现查询数据库需要我们修改Message.java,MessageD ...

  6. 1009 产生数 2002年NOIP全国联赛普及组

    1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 给出一个整数 n(n< ...

  7. scikit-learn API

    scikit-learn API 这是scikit-learn的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以提供有关其用途的完整指南. sklearn.base:基 ...

  8. HTML基本代码教学,第二天

    HTML 咱们今天来看一下咱们这HTML能做些什么,例如下图(最低级的小实验) 咱们来看一下图片的最左上角<head> <title></ title></ ...

  9. javaweb(十)——HttpServletRequest对象(一)

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  10. cocos2dx2.0 帧动画的创建和播放过程 深入分析

    一.帧动画的创建过程帧动画的实现有四个不可或缺的类,如下:1.CCSpriteFrame:精灵帧信息.存储帧动画的每一帧的纹理基本信息. class CC_DLL CCSpriteFrame : pu ...