Parfor gives NaN when for does not
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Tim Woodworth
el 10 de Mzo. de 2020
Comentada: Tim Woodworth
el 12 de Mzo. de 2020
I'm having issues parallelizing some code I use for a "homemade" spectrum analyzer.
It works fine in a for loop, however the
data=smooth(data,window);
Data=data(1+floor(window/2):length(data)-ceil(window/2));
part below (BoydFilter) causes issues (if I change it to Data=data; I get actual numbers) and my Data in ReadDAQTraces becomes a matrix of NaNs.
Can anyone tell me what I'm doing wrong?
*I and Q are arrays of 34.4 million doubles, if size is a problem.
function ReadDAQTraces(Folder,NumberOfTraces,Time,Points)
global SampleRate
SampleRate=2e6;
Data=zeros(NumberOfTraces,Points);
parfor i=1:NumberOfTraces
Data(i,:)=ReadInDAQ(Folder,i,Time,Points)
i
end
a=1;%for a debug stop
end
function Data=ReadInDAQ(Folder,i,Time,Points)
if ~ischar(i)
filename = strcat(Folder,'\I_Trace',int2str(i),'.csv');
else
filename = strcat(Folder,'\',i,'I.csv');
end
delimiter = {''};
formatSpec = '%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'ReturnOnError', false);
fclose(fileID);
I = dataArray{:, 1};
if ~ischar(i)
filename = strcat(Folder,'\Q_Trace',int2str(i),'.csv');
else
filename = strcat(Folder,'\',i,'Q.csv');
end
delimiter = {''};
formatSpec = '%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'ReturnOnError', false);
fclose(fileID);
Q = dataArray{:, 1};
Data=ApplyFilter(I,Q,Time,Points);
end
function Data=ApplyFilter(I,Q,Time,Points)
global SampleRate
SamplingRate=SampleRate;
window=Time*SamplingRate;
I=BoydFilter(I,window).^2+BoydFilter(Q,window).^2;
clear Q
Data=AverageDetector(I,Points);
end
function Data=BoydFilter(data,window)
if(window~=floor(window))
window
window=floor(window);
end
if(mod(window,2)==0)
-1*window
error('Boyd Filter Window is not an Odd Number')
end
data=smooth(data,window);
Data=data(1+floor(window/2):length(data)-ceil(window/2));
end
function Output=AverageDetector(Input,TotalPoints)
Output=zeros(1,TotalPoints);
AverageOver=floor(length(Input)/TotalPoints);
for i=1:TotalPoints
Output(i)=mean(Input((i-1)*AverageOver+1:i*AverageOver));
end
end
0 comentarios
Respuesta aceptada
Edric Ellis
el 11 de Mzo. de 2020
I'm not sure if this is the only problem, but the fact that you have a global variable set on the client and used by the workers is definitely a problem. The workers will not see the value set at the client (doc link). I suggest you modify your code to accept the SampleRate as an input parameter to your functions.
Más respuestas (0)
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!