作者:matrix
发布时间:2019-08-12
分类:零零星星
由于matlab编程偏向于学术方面,对于我这种😍喜欢OOP以及普通字符串操作来说多少的不熟悉和麻烦。
遂记录。
timer定时器操作
类似于javascript的setInterval操作
myTimer = timer('Name','MyTimer', ...
'Period',2, ... % 2秒钟间隔
'StartDelay',0, ...
'TasksToExecute',inf, ...
'ExecutionMode','fixedSpacing', ...
'TimerFcn',@myTimerCallback,...
'ErrorFcn',@(~,thisEvent)exit);% 如果报错 则推出程序
start(myTimer);%启动
function myTimerCallback(hObject, eventdata)
disp(['run time:: ', datestr(datetime('now'),'yyyy-mm-dd HH:MM:SS') ])
end
删除所有定时器:
delete(timerfindall());
手动抛异常
baseException = MException('MYFUN:BadParameter','Parameter miss');
throw(baseException);
throw函数需要传入异常类。
MException类第一个参数为msgID。必须要有冒号:
,名称都可以自定义。
参考:
https://ww2.mathworks.cn/help/matlab/ref/mexception.html
字符串比较
使用strcmp
函数进行字符串比较。
不同于使用双等号==
,双等号会对字符串中的每个字符进行比较相等,最终返回逻辑数组logical array
。
if strcmp(str,'timestr')%判断字符串相等
dis('Content is equal');
end
多行注释
单行注释使用百分号%
,
多行注释使用%{...%}
%{
...some thing
%}
函数默认参数判断以及设置值
function rel = func(arg1,arg2)
if exist('arg2', 'var') && ~isempty(arg2)%如果传入arg2参数 且不为空
bla bla
end
end
function [result] = func(format)
if ~exist('format', 'var') %不存在默认参数
result = '默认参数';
else
result = format;
end
end
exist函数中var
表示(变量)类型
https://blog.csdn.net/liuxiabing150/article/details/46519785
删除数组指定下标
list(1) = [];%删除指定的下标的元素
del_index_list = [1 2 9 18]
list(del_index_list) = [];%删除多个下标元素
检测struct结构体字段是否存在
isfield(struct('a','1'),'a1') #判断a1字段是否存在
all(isfield(struct('field1','val1'),{'a','b'}))#判断a,b字段是否都存在
参考:
https://ww2.mathworks.cn/matlabcentral/answers/260295-dynamically-name-a-struct
动态添加struct数据key名称
data = struct();
name = 'Dynamic_Name';
data.(name) = 990;
匿名函数
匿名函数最为回调的处理和调用
% 回调函数的执行
function rel = func(arg1,callback)
cb = callback(data);%执行回调函数,传入data数据作为参数
if ~cb
bla bla
end
end
%回调函数作为参数来使用
func(arg1,@(data)deal(1));
func(arg1,@(data)[a=1;deal(a);]);%匿名函数执行多条语句
%普通函数作为回调函数
func(arg1,@cb);
function rel = cb(data)
rel = 1
end
说明:
使用@
操作符
deal函数类似于java中的return
操作
方括号[]
最为数组操作可以防置多条语句来执行
追加保存数据到文件
now = 1583237214;
data_diff = 1;
data_uni_diff = 2;
res = [res;now,data_diff,data_uni_diff];
dlmwrite('chech_diff_time.txt',res,'-append');
-append参数表示追加处理
判断数据类型
class(123) % double
ischar('') % logic true
作者:matrix
发布时间:2019-08-11
分类:零零星星
默认matlab安装会根据系统语言环境来设置文件编码,想设置为utf-8编码反而是件麻烦事。
网上大多都说直接修改lcdata就可以,但是我找了一大圈都没看到里面出现的关键字内容,也试了很多方法都没用。
2017之后版本的lcdata.xml都只是空白的注释文件,其实就需要把lcdata_utf8改为lcdata或者把里面的内容放到lcdata.xml就可以了。
环境: matlab_R2018a for Mac
修改lcdata.xml
Mac lcdata.xml路径:/Applications/MATLAB_R2018a.app/bin/lcdata.xml
windows的话找到安装目录的bin文件夹
<?xml version="1.0" encoding="UTF-8" ?>
<!-- MathWorks Locale Database -->
<!-- File Name: lcdata.xml -->
<!-- Copyright 2007-2016 The MathWorks, Inc. -->
<lcdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="lcdata.xsd" >
<!-- Note: -->
<!-- This locale database is used to customize the MathWorks locale database. -->
<!-- Codeset entry example -->
<!-- <codeset> -->
<!-- <encoding name="StandardEncodingName" jvm_encoding="JavaEncodingName"> -->
<!-- <encoding_alias name="AliasName"/> -->
<!-- </encoding> -->
<!-- </codeset> -->
<!-- Locale entries example -->
<!-- <locale name="StandardLocaleName" encoding="EncodingName" xpg_name="XpgLocaleName"> -->
<!-- <alias name="AliasName"/> -->
<!-- "region_alias" is only for Mac -->
<!-- <region_alias name="RegionAliasName"/> -->
<!-- </locale> -->
<locale name="zh_CN" encoding="UTF-8" xpg_name="zh_CN.UTF-8"> </locale>
</locale>
在locale标签里面添加<locale name="zh_CN" encoding="UTF-8" xpg_name="zh_CN.UTF-8"> </locale>
之后再重启matlab就好了。
参考:
https://blog.csdn.net/qq_34241498/article/details/90168924
作者:matrix
发布时间:2019-07-26
分类:Linux
现在应要求需要再服务器端环境安装matlab以进行更好测试达到理想之效果。
测试环境:本地客户端macOS,服务器centOS 需要20GB空余
下载matlab
https://pan.baidu.com/s/1wijZCXIWsNXgz0yYYBXHnQ#提取e8b2
刚开始用mac三方百度客户端进行下载,没有校验文件md5和基本信息就直接对z01,z02进行解压拿到iso镜像文件挂载没问题。浪费时间一上午进行安装出现输入输出错误原因就是iso不完整。
文件哈希:
$ md5sum R2017b_glnxa64.iso
0bbe62e90ba9aaf357c72ef93e81753c R2017b_glnxa64.iso
若是本地上传到服务器最好使用rsync
附加参数-rP --append
来进行断点续传,要不然中断之后重新上传简直。。。
开始安装
需要系统有20GB
的剩余空间(包含iso文件,mnt挂载空间,程序安装空间)才可安装,我已经尝试过很多遍了😂😂😂
- 挂载镜像文件到
/mnt
$ mount -t iso9660 -o loop R2017b_glnxa64.iso文件路径 /mnt
如果挂载有问题可以考虑直接对iso进行解压缩:
$ sudo yum install p7zip p7zip-plugins
$ 7z x ubuntu-16.10-server-amd64.iso
- 执行安装
若之前安装中断或者失败需要清空之前的安装数据,否则会报错。
删除之前安装的文件:rm -rf /usr/local/MATLAB
还有安装matlab之前java环境不是必须安装,matlab包里面会自带jre。
$ cd /mnt
$ sudo ./install -fileInstallationKey 09806-07443-53955-64350-21751-41297 -agreeToLicense yes -mode silent -activationPropertiesFile MATLABR2017b_Linux_Crack目录中的license_standalone.lic文件路径
说明:
license_standalone.lic文件路径需自行替换
09806-07443-53955-64350-21751-41297为install_key.txt
中的授权码
执行之后就等待安装,若显示要继续 请点击″是″。 要返回″否″。是否仍要继续?
这些也不用管。
最终等待界面出现End - Successful.Finished
即表示安装完成。
破解
安装完成之后执行程序/usr/local/MATLAB/R2017b/bin/matlab
显示未激活状态
错误: 激活无法继续。您可能需要执行以下任一操作:
1.设置 X11 显示,然后重新启动激活过程
2.使用静默激活功能
3.使用许可证中心激活
执行激活程序/usr/local/MATLAB/R2017b/bin/activate_matlab.sh -propertiesFile /usr/local/MATLAB/R2017b/activate.ini
也没有用。
最后拷贝破解文件解决:
进入破解文件license_standalone.lic,libmwservices.so 所在目录
sudo cp license_standalone.lic /usr/local/MATLAB/R2017b/licenses/
sudo cp libmwservices.so /usr/local/MATLAB/R2017b/bin/glnxa64/
启动matlab
设置环境变量,避免每次执行/usr/local/MATLAB/R2017b/bin/matlab
很麻烦
$ echo 'export PATH=/usr/local/MATLAB/R2017b/bin:$PATH' >> /etc/profile
$ source /etc/profile
以后输入matlab
就可以启动
卸载之前的iso:umount /mnt
若无法卸载参考https://www.cnblogs.com/sisimi/p/7700309.html来强制推出操作。
后台执行.m脚本
安装服务器版本的最终目的其实就是让其后台运行,但是后面测试的时候发现了很多坑。
比如手动执行nohup matlab -nojvm -nodesktop -nodisplay -nosplash -r test.m > ./logfile &
这样会导致日志输出结果出现大量错误warning的提示,我是直接用supervisord
来守护进程,避免手动执行nohup
操作。
如果你用nohup matlab -nodesktop -nosplash -nodisplay < test.m >logfile
这种<
形式来调用脚本那就要小心了,因为会出现更多的错误,像Undefined variable com or class com.mathworks.timer.TimerTask
都是小事情,然而我这里是提示语法逻辑错误,感觉是脚本文件加载的时候出现字符问题,原因有很多,我这里没有具体进一步测试。我建议还是不要用<
这种形式来执行.m脚本。
参考:https://blog.csdn.net/sethinking/article/details/88375995
还有一个就是执行matlab脚本目录的问题,如果像这样直接-r 'run("/root/test.m");'
执行入口脚本test.m很有可能会找不到其中依赖该目录下的自定义函数。建议-r 'cd /root;test;'
这种形式来调用。
最终这样调用:
$ matlab -nodesktop -nodisplay -nosplash -r 'cd /home/script/;main;' >> /root/matlab_log_`date +"%Y%m%d"`.log
说明:
/home/script/main.m为脚本入口
这里没有使用-nojvm参数,也没有进一步测试我的脚本依赖是否可以不启动。
>> /root/matlab_log_
date +"%Y%m%d".log
为输出日志,名称为日期年月日
报错整理
./install:行269: /bin/glnxa64/install_unix: 输入/输出错误
确保iso镜像文件的完整性,需要知道iso的文件如果缺失一部分也是可以挂载的。😂
建议在Windows端用winrar点击R2017b_glnxa64.zip
执行解压拿到R2017b_glnxa64.iso
-
archive is not a ZIP archive
那就是空间不足的问题。
-
若非首次安装出现问题确保把之前的安装的文件都清空了
删除之前安装的文件:rm -rf /usr/local/MATLAB
-
出现libXt.so。。。Creating local MVM错误
MATLAB is selecting SOFTWARE OPENGL rendering.
Unrecognized MATLAB option "version".
Fatal Internal Error: Unexpected exception: 'N5boost16exception_detail10clone_implINS0_39current_exception_std_exception_wrapperISt13runtime_errorEEEE: Bundle#2 start failed: libXt.so.6: 无法打开共享对象文件: 没有那个文件或目录' in createMVMAndCallParser phase 'Creating local MVM'
这个问题今天上午才搞定,期间安装了很多包都不起作用。MD!!!
最终执行安装yum install libXt.x86_64
才解决。
中间我也查看过libXt.so.6这个鬼玩意的确是有的,后面看到因为matlab都需要32位和64位的包,所以这鬼玩意一直报错。
也有可能再期间安装的一部分包是依赖必须的:
$ yum list installed |grep libX
libX11.i686 1.6.5-2.el7 @base
libX11.x86_64 1.6.5-2.el7 @base
libX11-common.noarch 1.6.5-2.el7 @base
libX11-devel.x86_64 1.6.5-2.el7 @base
libXau.i686 1.0.8-2.1.el7 @base
libXau.x86_64 1.0.8-2.1.el7 @base
libXau-devel.x86_64 1.0.8-2.1.el7 @base
libXdamage.x86_64 1.1.4-4.1.el7 @base
libXdamage-devel.x86_64 1.1.4-4.1.el7 @base
libXdmcp.i686 1.1.2-6.el7 @base
libXext.i686 1.3.3-3.el7 @base
libXext.x86_64 1.3.3-3.el7 @base
libXext-devel.x86_64 1.3.3-3.el7 @base
libXfixes.x86_64 5.0.3-1.el7 @base
libXfixes-devel.x86_64 5.0.3-1.el7 @base
libXft.x86_64 2.3.2-2.el7 @base
libXft-devel.x86_64 2.3.2-2.el7 @base
libXi.i686 1.7.9-1.el7 @base
libXi.x86_64 1.7.9-1.el7 @base
libXmu.i686 1.1.2-2.el7 @base
libXp.i686 1.0.2-2.1.el7 @base
libXp.x86_64 1.0.2-2.1.el7 @base
libXrender.x86_64 0.9.10-1.el7 @base
libXrender-devel.x86_64 0.9.10-1.el7 @base
libXt.i686 1.1.5-3.el7 @base
libXt.x86_64 1.1.5-3.el7 @base
libXtst.i686 1.2.3-1.el7 @base
libXtst.x86_64 1.2.3-1.el7 @base
libXxf86vm.x86_64 1.1.4-1.el7 @base
libXxf86vm-devel.x86_64 1.1.4-1.el7 @base
这里整理一份本机已安装所有libX
开头的包,自行取舍。
-
大量报错信息 Bad file descriptor 和 Warning: "Error reading character from command line"
参照上面后台执行.m脚本
修改命令行调用的方式,去除nohup。使用supervisord
工具来守护进程,亦或者不要输出日志。
参考:
https://blog.csdn.net/qq_32892383/article/details/79670871
https://ww2.mathworks.cn/matlabcentral/answers/131366-why-do-i-see-i-o-errors-when-installing-matlab-using-the-iso-image
https://ww2.mathworks.cn/matlabcentral/answers/98745-why-do-i-receive-an-error-message-archive-is-not-a-zip-archive-during-matlab-installation-on-Linux
https://www.jianshu.com/p/a10397fcfb1d
https://blog.csdn.net/Xiao_Song_PKU/article/details/82700228
https://www.cnblogs.com/yaoyaoliu/p/6798463.html
https://linux.cn/article-7992-1.html
https://blog.csdn.net/qq_39187538/article/details/88676283
https://www.cnblogs.com/sisimi/p/7700309.html
https://www.centos.org/forums/viewtopic.php?t=31436
https://ww2.mathworks.cn/matlabcentral/answers/63751-how-do-i-get-matlab-running-in-batch-mode-to-only-output-the-results-of-disp-fprintf-etc-and-no
https://ww2.mathworks.cn/matlabcentral/answers/66793-problem-running-matlab-script-to-background
作者:matrix
发布时间:2019-07-15
分类:零零星星
本来只是想获取字符串的MD5hash值,结果发现麻烦。首先去mathworks找到的DataHash,GetMD5这些函数要么无法使用,要么就是计算出来的md5值是错误的,反正达不到效果。
刚开始以为mathworks的代码必须登录账户才能下载,现在才发现,点击Overview旁边的Functions
选项卡就能看到源代码。 😂
当初就算是找到了一些函数也是不能使用,最后还是使用python库来解决。好在matlab对python的调用非常简单。直接使用py
库就好了,唯一的问题就是有些python的语法和matlab不同,比如切片[:::]
操作这些。
安装python3环境
2019-08-19测试发现macos中3.7版本可以,但是在centOS中就调用失败。所以就centOS中测试安装3.5的版本了。
后面发现应该是编译时的enable-shared参数问题。
2020-02-18centos中测试可以直接用conda来安装python3.5使用,3.6,3.7测试调用失败!
开始手动编译安装
cd ~
yum install zlib-devel bzip2-devel openssl-devel ncurese-devel
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
tar xf Python-3.5.0.tgz
cd Python-3.5.0
./configure --enable-shared #matlab要求必须设置enable-shared参数
make && make install
参考:
https://ww2.mathworks.cn/help/matlab/matlab_external/undefined-variable-py-or-function-py-command.html#buialof-67
https://ww2.mathworks.cn/help/matlab/getting-started-with-python.html?lang=en
切换默认的python解释器
matlab输入
pyversion`可以查看python解释器路径,如果需要修改:
pyversion /usr/local/bin/python3 %切换到python3.7指定路径
直接调用python内置函数
计算字符串md5函数
使用python的hashlib库进行操作
function[re]=md5(str)
%{
依赖python进行md5 hash
%}
m2 = py.hashlib.md5();
m2.update(py.str(str).encode('utf-8'));
re = char(m2.hexdigest());
说明:
此函数依赖python环境,确保系统中有安装。
兼容Linux,Mac,Windows
最后char函数是将py.str
类型转换为matlab的str
知道了这个操作,以后很多操作就会非常简单。
比如
获取当前时间戳:
str2num(char(py.int(py.time.time())))
直接用py
库来调用即可,最后再使用matlab函数str2num,char处理成number类型。
调用自定义.py脚本函数
上面的方法倒是可以解决一部分难题,但是遇到方括号[]、百分号%操作符这些直接在.m
文件中就不会执行了。毕竟matlab是以它的语法来解析,这样只得起调.py
文件来操作。
新建test.py
文件位于当前工作目录
def func():
return '123'[::-1]
载入python脚本:
%脚本所在路径,空字符串表示当前目录
path = '' %当前目录
%path = 'a/' %当前的子目录a
if count(py.sys.path,path) == 0
insert(py.sys.path,int32(0),path);
end
%清除脚本缓存,执行重载操作
clear classes;
mod = py.importlib.import_module('test');%载入的脚本模块
%mod = py.importlib.import_module('a.test');%载入的子目录下的脚本模块
py.importlib.reload(mod);
调用py.test.func
即可得到切片结果321
,注意为py.str
类型。
子目录形同:py.子目录.文件名.函数名
当修改py文件之后再调用会发现还是之前的结果,matlab缓存了之前的python脚本,所以这里需要clear classes...
这类操作。
参考:
MATLAB 调用 Python
https://www.cnblogs.com/zknublx/p/6212590.html
https://blog.csdn.net/jnulzl/article/details/51170859
https://zhuanlan.zhihu.com/p/42598340
https://blog.csdn.net/x5675602/article/details/52134981
http://www.1cae.com/a/MatLab/52/python-matlab-8943.htm
作者:matrix
发布时间:2019-06-27
分类:零零星星
matlab网络请求操作完成之后需要对返回数据读取,操作时候出现的问题就是无法循环struct数据。
因为接口一般以json数据格式返回,matlab会把Object结构处理为struct数据而无法循环读取。很多字段的时候我可不希望看到手写矩阵声明。
取struct长度的size
和length
都无法正常返回其元素个数,听说它不是向量。
办法
用fieldnames
函数获取struct的字段field数据(返回为cell元胞数组)
之后用structName.(expression)
这种操作获取动态的struct数组数据。比如struct.a
等同于动态操作的struct.('a')
现在才知道文档上有,我TM竟然随便点括号猜出来的~
%声明方式1
%s = struct('a',11,'b',222)
%声明方式2
s=struct
s.a = 11
s.b = 222
% https://ww2.mathworks.cn/help/matlab/ref/struct.html
fileds = fieldnames(s);
for i=1:length(fileds)
k = fileds(i);
key = k{1};
value = s.(key);
disp(key)
disp(value)
disp('---')
end
% s.('a') %动态结构体引用
升级操作:自动生成对应变量
按照Struct字段自动生成对应的变量名和值
s = struct('a',11,'b',222)
fileds = fieldnames(s);
for i=1:length(fileds)
k = fileds(i);
key = k{1};
value = s.(key);
eval(['variable_',num2str(key) ' = ' num2str(value)])
end
说明:
使用eval函数
动态创建variable_%s
的变量。
本来在mathworks上看到有人发布过Structure fields to variables方法来自动处理struct,但是没有正版授权码 所以无法下载使用。
参考:
https://ww2.mathworks.cn/help/matlab/learn_matlab/types-of-arrays.html
https://ww2.mathworks.cn/help/matlab/ref/struct.html
https://www.ilovematlab.cn/thread-317868-1-1.html
https://ww2.mathworks.cn/matlabcentral/fileexchange/26216-structure-fields-to-variables
PEACE~
作者:matrix
发布时间:2019-06-22
分类:零零星星
matlab这个学术界的编程语言我是几个月前听说,有些基本操作是真的麻烦,当然在其他方面matlab是相当🐂🍺
使用Matlab进行GET/POST请求调用接口,提交参数。
之前苦于没有将get请求的query参数进行变量提取,好在www.mathworks.com找到有文档说明
GET请求操作函数封装
get网络请求封装成函数get_request
%GET网络请求
function [result]=get_request(uri,query)
import matlab.net.* %导入Matlab网络请求库
import matlab.net.http.*
uri = URI(uri);%请求地址;
uri.Query = matlab.net.QueryParameter(query);%get 附加请求参数
r = RequestMessage;
r.Method = 'GET';%使用GET请求类型
response = send(r,uri);%发送请求
status = response.StatusCode%获取服务器响应的状态码
if (status==200) %一般成功响应的状态码为200 表示ok 即成功
content = response.Body.Data; %获取服务器响应的内容
result = content;
else
disp('请求失败')
end
说明:
参数1 uri: 请求url, 如:http://hhtjim.com
参数2 query: get请求参数 传入struct类型数据
还有就是接口返回json数据(response响应头有指定type json),matlab会自动解析json数据,最后用response.Body.Data
调用就好,不方便查看的那就debug。
如果要手动处理json字符串的话使用jsonencode
, jsondecode
进行编解操作。
调用举例:
请求:http://hhtjim.com?arg=123
get_request('http://hhtjim.com',struct('arg', '123'))
或者
query.arg = '123'
get_request('http://hhtjim.com',query)
上面两种方式的调用都可以完成操作。matlab内部会自己封装拼接为http://hhtjim.com?arg=123
进行请求。
如果想要更简单的ge请求可以使用webread进行操作。
POST请求
这里测试的POST的请求更为复杂,会添加自定义请求头,post body表单内容,cookie的涉及。所以没有封装成统一调用的函数,需要的自行修改咯~
import matlab.net.* %倒入Matlab网络请求库
import matlab.net.http.*
uri = URI('http://localhost:8080/testOrder/double_param/');%请求地址
%添加请求参数
qStruct.K=1;
qStruct.d2=2;
qStruct.d1=3;
qStruct.L=4;
qStruct.order_switch=1;%1开 0关
qStruct.order_size=2;
qStruct.diff_earnings=1.00009;
r = RequestMessage;
r.Method = 'POST'%使用POST请求类型
csrf = 'YYC0e8GICcEroZGDuL8THJ4ZQdwQpDqNtkBsfnaBP0XpH3rqYVNXADJGpWdo53o0'%Djabgo框架表单中防止跨站请求的参数,其实这是服务器生成的伪随机字符
qStruct.csrfmiddlewaretoken=csrf;
r.Body = matlab.net.QueryParameter(qStruct)%放入请求参数
%添加请求头
r = addFields(r,'Content-Type','application/x-www-form-urlencoded');
r = addFields(r,'Cookie',sprintf('csrftoken=%s',csrf));
response = send(r,uri);%发送请求
status = response.StatusCode%获取服务器响应的状态码
if (status==200) %一般成功响应的状态码为200 表示ok 即成功
content = response.Body.Data %获取服务器响应的内容
disp('请求成功:')
disp(content)
else
disp('请求失败')
end
%参考:
%https://ww2.mathworks.cn/help/matlab/http-interface.html
%https://ww2.mathworks.cn/help/matlab/ref/matlab.net.http.requestmessage.send.html#bu199af-6
%https://www.mathworks.com/help/matlab/ref/matlab.net.http.message.addfields.html
%https://ww2.mathworks.cn/help/matlab/ref/matlab.net.queryparameter-class.html
最后我真想说术业有专攻
,用matlab进行网络请求是的自讨苦吃。
参考:
https://ww2.mathworks.cn/help/matlab/ref/matlab.net.uri-class.html#bvflp65-2
https://ww2.mathworks.cn/help/matlab/http-interface.html
https://ww2.mathworks.cn/help/matlab/ref/matlab.net.http.requestmessage.send.html#bu199af-6
https://www.mathworks.com/help/matlab/ref/matlab.net.http.message.addfields.html
https://ww2.mathworks.cn/help/matlab/ref/matlab.net.queryparameter-class.html