版权声明:若无来源注明,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. Rails中生成并在ActionMailer附件中发送csv、excel、pdf、zip文件

    1.修改Gemfile # PDF generator gem 'prawn' gem 'prawn-table' # Excel generator gem 'rubyXL' #Zip genera ...

  2. 2016-2017-2 《Java程序设计》课程总结 - 20155214

    2016-2017-2 <Java程序设计>课程总结 - 20155214 目录 一.每周学习总结及实验报告链接汇总 二.代码托管 给出statistic.sh的运行结果,说明本学期的代码 ...

  3. 初步安装配置虚拟机、Ubuntu、git、vim、码云项目

    内容 虚拟机软件:Oracle VM VirtualBox 系统:Ubuntu 配置:git:码云;vim 过程 下载安装VirtualBox.ubuntu 根据链接-- 基于VirtualBox安装 ...

  4. PostgreSQL如何导入SJIS字符集的文件

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  5. 【转载】C/C++杂记:虚函数的实现的基本原理

    原文:C/C++杂记:虚函数的实现的基本原理 1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: ...

  6. SRM 563 500pts SpellCards

    SpellCards 题意: 有n张符卡排成一个队列,每张符卡有两个属性,等级li和伤害di. 两种操作: 1.把队首的符卡移动到队尾:2.使用队首的符卡,对敌人造成di点伤害,并丢弃队首的li张符卡 ...

  7. 可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking

    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking 对Skywalking有兴趣的同学参见:年轻人的第一个APM-Skywalking 之前在搭建Skywalki ...

  8. Error running 'Tomcat 7': Unable to open debugger port (127.0.0.1:9342)

    这个只需要把java虚拟机进程结束掉就行了

  9. R的数据结构

    R语言中的数据结构包括标量.向量.矩阵.数组.列表以及数据框 目录 1 向量 2 矩阵 3 数据框 1 向量 向量是用于存储单一数据类型(数值.字符.逻辑值)的一维数组,示例如下: a <- c ...

  10. DevOps是一种文化,不是角色!

    一.DevOps是一种文化,不是角色! 软件无处不在.在如今的世界里,每个主流公司/组织都和软件开发息息相关,并且公司需要向软件一样运作.更快且更敏捷,同时保证安全性和可靠性,这样的要求前所未有的强烈 ...