Simple for loop taking way longer than it should
6 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Samantha Huff
el 2 de Dic. de 2021
I am running a for loop on 10 million lines of data and it has taken over a day and is still running. I have preallocated the array I am modifying according to suggestions provided by Matlab for optimizing runtime. This post says 100 million lines of data ran in a simple for loop in 0.2 seconds. I am testing my code both on my personal computer (Mac) and a remote server. Why is my code so slow??
%% read in file
cwaFileToRead = '6011549_0000000003.cwa';
ptID = '6011549_0000000003';
sampling_rate = 100;
Fs = sampling_rate;
output_dir = '';
rawData = CWA_readFile(cwaFileToRead, 'verbose', 0);
%% calculate vector magnitude
xRaw = rawData.AXES(:,2);
yRaw = rawData.AXES(:,3);
zRaw = rawData.AXES(:,4);
vmRaw = sqrt((xRaw.^2)+(yRaw.^2)+(zRaw.^2));
vmRaw = vmRaw.*(1000);
numrows=size(vmRaw);
peak=zeros(numrows);%add empty rows for peak identification
time = datetime(rawData.AXES(:,1), 'ConvertFrom', 'datenum'); % convert mtime to datetime
timedata = timetable(time, xRaw, yRaw, zRaw, vmRaw, peak); % convert data to timetable
%% CHECK FOR UNIFORM SAMPLING, RESAMPLE IF NOT UNIFORM
% Check if sampling rate is uniform
isUniform = isregular(timedata);
% If sampling rate is non-uniform, resample at regular sampling intervals
if isUniform == 0
timeStep = seconds(1/Fs); % how long between each regular sample
regularizedData = retime(timedata,'regular','linear','TimeStep',timeStep);
fprintf('Sampling rate is non-uniform, resampling using linear interpolation\n')
else
regularizedData = timedata;
end
%FOR LOOP THAT IS SO SLOW!! HELP!
tic
for row = 2:numrows-1
if regularizedData.vmRaw(row)>regularizedData.vmRaw(row-1)&& regularizedData.vmRaw(row)>regularizedData.vmRaw(row+1)
regularizedData.peak(row)=1;
else
regularizedData.peak(row)=0;
end
end
toc
2 comentarios
Respuesta aceptada
Matt J
el 2 de Dic. de 2021
Editada: Matt J
el 2 de Dic. de 2021
I don't see why it would be slow, but there's no need for a for loop at all,
regularizedData.peak(2:end-1) = regularizedData.vmRaw(2:end-1)>regularizedData.vmRaw(1:end-2)&...
regularizedData.vmRaw(2:end-1)>regularizedData.vmRaw(3:end);
1 comentario
Steven Lord
el 2 de Dic. de 2021
Or you could just use islocalmax.
y = randi(50, 1, 10)
[ y; ...
islocalmax(y); ...
false (y(2:end-1) > y(1:end-2)) & (y(2:end-1) > y(3:end)) false]
Más respuestas (0)
Ver también
Categorías
Más información sobre Signal Generation and Preprocessing 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!