版权声明:若无来源注明,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. python+selenium实现动态爬取及selenuim的常用操作

    应用实例可以参考博客中的12306自动抢票应用 https://www.cnblogs.com/mumengyun/p/10001109.html 动态网页数据抓取 什么是AJAX: AJAX(Asy ...

  2. python 数据类型、进制转换

    数据类型 存储单位 最小单位是bit,表示二进制的0或1,一般写作b 最小的存储单位是字节,用byte表示,1B = 8b 1024B = 1KB 1024KB = 1MB 1024MB = 1GB ...

  3. 参考 https://raspberrypi.stackexchange.com/questions/3617/how-to-install-unrar-nonfree > 1.卸载unrar-free。 $ sudo apt-get remove unrar-free \ 2.通过编辑确保您拥有源存储库/etc/apt/sources.list。 $ cat /etc/apt/sources.

    from my CSDN: https://blog.csdn.net/su_cicada/article/details/86939944 参考 https://raspberrypi.stacke ...

  4. Python3的venv虚拟环境操作(Linux)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Python3.3以上版本支持了原生的虚拟环境命令,即venv. 长话短说,具体的理论在这里就不多说了,主要的操作 ...

  5. Python3 图像识别(二)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 以图搜图的使用已经非常广泛了,我现在来介绍一下简单的以图搜图的相关算法及其实践. 一.感知hash算法 感知哈希算 ...

  6. Python系列之 迭代器和生成器

    很多Python的程序员都会混淆 迭代器 和 生成器 的概念和作用,分不清到底两个有什么区别.今天我们来好好说一说这两个概念. 迭代器(Iterator) Iterator Pattern Itera ...

  7. 20155327 嵌入式C语言课堂补交

    嵌入式C语言 题目要求 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) 题目分析 分析一:提取插入时间 根据老师上 ...

  8. [2016北京集训测试赛7]isn-[树状数组+dp+容斥]

    Description Solution 定义dp[i][j]为在1到i个数中选了j个数,并且保证选了i的选法总数. dp[i][j]为所有满足A[k]>A[i]的k(k<i)的dp[k] ...

  9. OpenCV人脸识别的原理 .

    OpenCV人脸识别的原理 . 在之前讲到的人脸测试后,提取出人脸来,并且保存下来,以供训练或识别是用,提取人脸的代码如下: void GetImageRect(IplImage* orgImage, ...

  10. 【转载】DXUT11框架浅析(4)--调试相关

    原文:DXUT11框架浅析(4)--调试相关 DXUT11框架浅析(4)--调试相关 1. D3D8/9和D3D10/11的调试区别 只要安装了DXSDK,有个调试工具DirectX ControlP ...