论文实验—使用多线程循环调参数(matlab parfor函数)

实验参数调整是一个比较麻烦也很费时的过程,本文将介绍一种使用多线程的方法在服务器上调参的方法,将会非常省时。除了多线程循环,还有一些相关的内容也会介绍。

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表示一个类,所有的类需要在循环中定义;

你可能感兴趣的:(matlab,调参,多线程,parfor)