概述
2.6 如何使用 MATLAB 自带函数
2.6.1 如何使用返回值数据类型不定的 MATLAB 自带函数
如果所使用的 MATLAB 自带函数返回值有不同数据类型的情况,则要写根据不同情况进行处理的代码。
比如:
LineH = find_system (gcs,... %这个函数只返回 double 类型所以不需要判断处理
' FindAll ', ' on ',' Type ',' Line ',' Dstporthandle ',-1);
SrcPortH = get_param (LineH ,' srcporthandle ');% 这个函数的返回值类型不固定
if iscell (SrcPortH ) % 如果 LineH 是 0 个或者 2 个以上,会返回 cell 类型
delete_Line (LineH ([SrcPortH {:}] ~ =-1);
else % 如果 LineH 是 1 个,则 SrcPortH 是个 double 类型
delete_Line (LineH (SrcPortH ~= -1));
end
% 那如果写成这样,就不行:
LineH = find_system (gcs,... %这个函数只返回 double 类型所以不需要判断处理
' FindAll ', ' on ',' Type ',' Line ',' Dstporthandle ',-1);
SrcPortH = get_param (LineH ,' srcporthandle ');% 这个函数的返回值类型不固定
delete_Line (LineH ([SrcPortH {:}] ~ =-1);
如果返回值的数据类型是会变的 ,那表示在不同场景下会返回不同的数据类型,如果不做兼容处理,会发生错误。
2.6.2 使用 exist 的时候,要指定类型
使用 exist 的时候,要指定类型。
因为 exist 只会按照优先级顺序来查找,而返回找到的第一个。如果不同类型的同名对象,可能会错过优先级低的同名对象也存在的信息。
比如:
ret1 = exist (' name ',' dir '); % ret1 == 7
ret2 = exist (' name ',' file '); % ret2 == 2
% 而不要这样写:
ret1 = exist (' name '); % ret1 == 7,此时判断顺序低的类型不输出
2.6.3 使用 strcmp 来对比字符串而不要使用 ==
使用 strcmp 来对比字符串而不要使用 ==。
当 check_str = ‘temp’ 和 ‘test’ 比较时
% 对比字符串可以这样写
ret = strcmp(chec_str,'test'); % ret为 0
% 而不要这样写:
ret = isequal(chec_str,'test'); % ret为 0
% 下面这样做数组比较,比较会得到 [1 1 0 0]
% 但这样做比较时,如果字符数组长度不一致,会出错
ret = chec_str == 'test');
% 同样是如果字符串不匹配,会出错
ret = all(chec_str,'test'); % ret为 0
当 check_str = ‘temp’ 和 ‘t’ 比较时
显然也要这样写:
ret = strcmp(chec_str,'t'); % ret为 0
而如果直接比较的话,
% 会自动把t扩充为 tttt,然后进行比较,得到 [1 0 0 0]
ret = chec_str == 't');
如果是不小心把字符和数字进行比较了,会对比字符串的ASCII码的值。
这有可能不是我们所期望的。
Check_str2 = 65;
ret = isequal(check_str, check_str2); % ret 为 1
2.6.4 如何写文件操作相关代码
- 使用 fopen 打开的文件使用 fclose 来关闭。
如果不及时关闭,有可能会误写。
fileID = fopen (' file.m ');
:
Fclose (fileID);
- 使用 fopen 打开某个文件后,不要再使用 fopen 来打开它。
重复打开同一个文件,则会得到不同过的 fileID,那就意味着用不同的 ID 来操作同一个文件,有可能会得到意料之外的结果。
fileID = fopen ('file.m');
fileID = fopen ('file.m'); % fileid 被重新覆盖
fclose (fileID);
% 即使 fclose 关闭了覆盖后的ID
% 但是文件 file.m 扔有之前的 ID 处于打开状态
- 如果在使用 fopen 打开文件时使用了 ‘r’ 作为打开类型,就不要用 fwrite 和 fprint 来写入文件。
注意,在不指定打开类型的情况下,默认是 ‘r’。
如果要写入文件,使用带 'w’ 的打开类型参数。因为写入只读文件,并不会真的写入内容,也不会报错给予提示,这样容易有潜藏的错误产生。
fileid = fopen ('file.txt','w');
fprintf (fileid, ' Hello, World! ');
fclose (fileID);
% 而不要这样写:
% 如果不指定打开类型,则默认是 r
fileid = fopen ('file.txt');
% 执行语句并不会写进去
fprintf (fileid, ' Hello, World! ');
fclose (fileID);
2.6.5 如何写模型操作代码
- 使用 Simulink 模型操作函数 xxx([],[],[],‘compile’) 命令来编译模型时,务必要使用 xxx([],[],[],‘term’) 命令来退出这个状态。
模型在编译阶段出错的话,模型会被锁定也退不出去。
% 所以要用 try-catch 来确保程序不会死掉
try
% 编译
xxx([],[],[],'compile')
% 采集编译阶段的数据
・・・
% 结束编译状态
xxx([],[],[],'term')
catch exception
% 结束编译状态
xxx([],[],[],'term')
disp (exception.message);
end
最后
以上就是瘦瘦哈密瓜为你收集整理的解读 JMAAB MATLAB 编程规范 2018版本 - Part 6的全部内容,希望文章能够帮你解决解读 JMAAB MATLAB 编程规范 2018版本 - Part 6所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复