联调 matlab 遇到的一些事儿

记录当时遇到的问题,因为平时不写 matlab,所以没有深入的理解。

版本兼容

当时遇到的第一个问题就是不同版本 matlab 带来的兼容性问题。同时开发使用的是 2021a 版本,而调试时使用的是 2022b 版本。在新版本中某些函数已被弃用,导致程序运行失败。

因此,在一个团队内部,应该使用统一的 matlab 版本,同时要在程序中严格声明适用的版本。

可以尝试通过以下方式,检查兼容性,提升兼容性:

  1. codeCompatibilityReport 代码兼容性报告)通过这个函数可以查看项目代码的兼容性。
  2. MATLAB 代码兼容性分析器
  3. 升级工程

网络操作

websave、webwrite、webread

通过 RESTFul API 读写数据。也可以适用 webread get 网络数据

websave 可以通过 get 方法获取数据,并存储到指定的文件中。

% http 客户端
% 需要注意的是,resulttemp 不用转为字符串,工具自己会根据 Content-Type 自动处理传入的 data 数据

import matlab.net.http.*
import matlab.net.http.field.*

resulttemp = containers.Map();
resulttemp("topic") = topic;
resulttemp("key") = key;
resulttemp("msg") = msg;

uri = matlab.net.URI("http://10.3.63.38:9100/mq/");
headers = HeaderField("Content-Type","application/json");
req = RequestMessage(RequestMethod.POST, headers, resulttemp);
req.send(uri);
% 适用 form-data 上传文件。
% matlab 提供了其他不同的 Provider 满足业务需求,可以自行探索
fps = matlab.net.http.io.FileProvider("aa.zip");
formProvider = matlab.net.http.io.MultipartFormProvider("ext", "zip", "file",fps);
req = matlab.net.http.RequestMessage('post',[],formProvider);
uri = matlab.net.URI('http://10.3.63.38:9004/stash/upload');
result = req.send(uri);  

写文件

% 通用函数,可以将字节,字符串等数据直接写入到文件
x = 0:.1:1;
A = [x; exp(x)];

fileID = fopen('exp.txt','w');
fprintf(fileID,'%6s %12s\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\n',A);
fclose(fileID);

writetablewritematrixwritecell 可以将对应数据类型的数据写入文件,文件格式支持 .txt、.dat、csv、.xls 等。详见官方文档。

xlswrite 在高版本中已经弃用,在项目中不建议适用。

json 解析

json 解析用到了 jsonlab 库。主要用的 api 有:loadjson savejson jsonencode jsondecodejsondecode 可以把 struct MAP 等数据结构转为 json 字符串。jsondecode 可以把字符串解析成 struct、数组等。

a = fopen('config.json');
b = fread(a,inf);
% 此处注意要转秩
decodedJson = jsondecode(char(b'));
% 上面代码也可以写成
% decodedJson = jsondecode(char(b)');
% 此时要注意:decodedJson 中如果存在数组,则数组是 n*1,而不是 1*n


% 警告 1: decodedJson 中如果有数组,那么 jsonString 中的数组就会被错误的保存为二维数组
% 要修复这个问题,需要把第三个参数改为 opt,在 opt 中指定如何处理 n*1 数组。详情请参考官方文档
% 警告 2:如果 decodedJson 是一个字符串,savejson 函数会对字符串中的特殊字符添加 "\" 转义,然后把这个字符串保存到文件中
jsonString = savejson('',decodedJson,'aaaaa.json');

另外需要注意的是,loadjsonsavejson 是一对,jsondecodejsonencode 是一对。最好避免两组交叉使用,否则容易出现意料之外的错误。

考虑到 savejson 函数的灵活性和复杂性,建议使用 jsondecode 这一组来处理 json,他们更符合直觉期望。下面是建议的实践:

a = fopen('config.json')
b = fread(a, inf);
decodedJson = jsondecode(char(b'));

% modify decodedJson

jsonString = jsonencode(decodedJson);

fid = fopen('result.json', 'w+');
fwrite(fid, jsonString);
fclose(fid);

如果要构造 json 对象,建议使用 constainers.Map,不建议使用 struct

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值