引言
MATLAB是科学工程计算分析的重要编程环境,除了数值计算代码的编写,我们往往修改输入参数,作为研究变量。如果直接在代码脚本中修改有两个问题:
- 修改不便,必须进入代码内部,找出相关变量;
- 不熟悉程序的人有可能将程序修改错误,得到错误的结果。
解决这一问题的一种方案是:采用参数对话框输入。但是,MATLAB自带的inputdlg
函数功能有限,调用较为麻烦,因此在此基础上订制开发了paradlg
。
问题描述
某MATLAB程序,需要输入以下参数:
f_center = 100
filename = 'B1_C1_F'
dt = 16
f_range = [0 20]
预期以下图的对话框输入:
![paradlg.jpg-27.3kB](http://static.zybuluo.com/frank0449/icnvopsodjy1t5drov0avrun/paradlg.jpg)
paradlg.jpg-27.3kB
应用示例
基本调用
使用方法:
- 构造
prompt0
数据,第一列为输入提示,第二列为默认参数; - 支持三类数据输入,标量、向量、字符串;
- 调用
paradlg
函数,返回输入的数据集para
; - 将
para
中的元素依次赋值给目标的变量f_center,filename_pub,dt,f_range
;
prompt0 = { % 对话框参数
'发射信号中心频率(kHz)', 100
'发射信号中心频率(kHz)','B1_C1_F'
'采样周期dt (e-9 s)',16
'绘图频谱范围(kHz)',[0 20]
};
para = paradlg(prompt0);
f_center = para{1}; % 发射信号中心频率(kHz)
filename_pub = para{2}; % 输出报告文件名
dt = para{3}; % 采样周期
f_range =para{4};
结果如图:
![paradlg.jpg-25.5kB](http://static.zybuluo.com/frank0449/icnvopsodjy1t5drov0avrun/paradlg.jpg)
paradlg.jpg-25.5kB
高级调用
如需控制对话框的宽度、标题,则在函数paradlg
中输入第二个变量dlg0
。
% dlg0.width -- 对话框宽度
% dlg0.title -- 对话框标题
操作示例:
prompt0 = { % 对话框参数
'发射信号中心频率(kHz)', []
'发射信号中心频率(kHz)','B1_C1_F'
'采样周期dt (e-9 s)',16
'绘图频谱范围(kHz)',[0 20]
};
dlg0.width = 100;
dlg0.title = '信号谱分析参数输入';
para = paradlg(prompt0,dlg0);
f_center = para{1}; % 发射信号中心频率(kHz)
filename_pub = para{2}; % 输出报告文件名
dt = para{3}; % 采样周期
f_range =para{4};
![paradlg-pro.jpg-33.6kB](http://static.zybuluo.com/frank0449/xw9rjdmn7sptqocyy7u41yt9/paradlg-pro.jpg)
paradlg-pro.jpg-33.6kB
主程序代码
function para = paradlg(prompt0,dlg0 )
% 题目:标准化对话框创建程序
% 参数:
% prompt0 -- 必要参数,提示语以及默认参数,n*2
% dlg0 -- 可选参数对话框宽度,标题信息
% dlg0.width -- 对话框宽度
% dlg0.title -- 对话框标题
% dlg0.auto -- 是否自动保存上次数据,dlg0.auto=1或dlg0.auto=0
% 功能:
% 创建标准化参数输入对话框
% 支持 标量、向量、字符串
% 导出输入参数
% 记忆上次输入
% 作者: 马骋
% 参考:无,使用示例见附录
% 2016.03.30 @HIT
%% prompt参数
n = size(prompt0,1);
prompt = cell(n,1); % 提示语
def0 = cell(n,1); % 默认参数
for iloop = 1:n
prompt{iloop} = prompt0{iloop,1}; % 参数分离
def0{iloop} = num2str(prompt0{iloop,2}); % 默认参数必须为字符串格式
end
try
load data_dlg % 导入上次运行数据def
catch
def =def0;
end
%% dlg参数
try % 宽度设置
dlg.width = dlg0.width;
catch
dlg.width = 60;
end
try % 标题设置
dlg.title = dlg0.title;
catch
dlg.title = '参数输入';
end
%% 对话框
linewidth = ones(n,2); % 宽度设置
linewidth(:,2) = linewidth(:,2)*dlg.width; % 可以输入控制
options.Interpreter='tex';
para_dlg = inputdlg(prompt,dlg.title,linewidth,def,options); % 打开对话框,获取参数字符串
%% 参数转换
% 向量转换,字符串转换
para = cell(n,1); % 输出参数
for iloop = 1:n
temp = ['[',para_dlg{iloop},']']; % 默认按向量转换
para{iloop} = str2num(temp);
if isempty(para{iloop}) % 如果转换后为空,则为字符串
para{iloop} = para_dlg{iloop};
end
end
%% 参数保存
def = para_dlg; % 本次输入赋值给def
save('data_dlg','def'); % 保存对话框数据,用于下次导入
try
if ~dlg0.auto
delete data_dlg.mat
end
catch
end
end