实验参数调整是一个比较麻烦也很费时的过程,本文将介绍一种使用多线程的方法在服务器上调参的方法,将会非常省时。除了多线程循环,还有一些相关的内容也会介绍。
1.参数和结果存储
使用txt文件存储参数与结果:
statname = 'result.txt'; %设置存储txt文件名
fid = fopen(statname, 'a+'); %打开txt文件
% ......
fprintf('%s: a=%g,SNR = %.2f, dataname,a,SNR);
% 在matlab中输出文件名、参数和结果
fprintf(fid,'%s: a=%g,SNR = %.2f, dataname,a,SNR);
% 在txt中输出结果
2.for循环调参数
tab_a=[]; %用于设置参数范围
for i1=1:numel(tab_a)
a=tab_a(i1);
%......
end
参数范围的设置:
①linspace与logspace
tab_a=linespace(a,b,n); %范围[a,b]中等间隔取n个数
tab_a=logspace(a,b,n); %范围[10^a^,10^b^]中按对数等间隔取n个数
②等间隔
tab_a=5:5:30;
③自设置序列
tab_a=[1 5 10 30 50 100];
3.多线程循环(parfor函数)
如果需要调多个参数,那么计算量就会很大,此时多线程循环将有更大优势。我们以两个参数遍历为例:
需要说明的是,我们调用了一个函数NN来进行实验。将参数a和b存储在一个结构体opts中使用。
statname = 'result.txt';
tab_a=[];
tab_b=[];
[a_grid,b_grid] = ndgrid(tab_a,tab_b);
out = cell(numel(a_grid),1);
optss = cell(numel(a_grid),1);
parfor imus = 1:numel(a_grid)
optss{imus} = opts; %结构体设置
optss{imus}.opts.a = a_grid(imus);
optss{imus}.opts.b = b_grid(imus);
optss{imus}.FT = p2DFT; %类定义
[out{imus}] = NN(data,optss{imus});
%调用函数NN,输入data和相关参数,输出out
fid = fopen(statname, 'a+'); %打开txt文件
fprintf('%s: a=%g,b=%g,SNR = %.2f, dataname,optss{imus}.a,optss{imus}.b,SNR);
fprintf(fid,'%s: a=%g,b=%g,SNR = %.2f, dataname,optss{imus}.a,optss{imus}.b,SNR);
end
使用多线程需要注意:
①需要在循环中打开txt文件,才能存储结果到txt;
②FT表示一个类,所有的类需要在循环中定义;