Simple for loop taking way longer than it should

2 visualizzazioni (ultimi 30 giorni)
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 Commenti
Ive J
Ive J il 2 Dic 2021
can you share regularizedData struct?
Samantha Huff
Samantha Huff il 2 Dic 2021
head(regularizedData)
ans =
8×5 timetable
time xRaw yRaw zRaw vmRaw peak
____________________ _______ ________ ________ ______ ____
13-Nov-2021 10:00:05 1.5724 -0.93819 1.077 2111 0
13-Nov-2021 10:00:05 1.1085 -0.80026 0.60829 1503.3 0
13-Nov-2021 10:00:05 0.6409 -0.71118 0.14545 1000.7 0
13-Nov-2021 10:00:05 0.32321 -0.50765 0.080661 625.47 0
13-Nov-2021 10:00:05 0.27804 -0.06346 0.20332 439.7 0
13-Nov-2021 10:00:06 0.4884 0.48265 0.1555 723.28 0
13-Nov-2021 10:00:06 0.8808 0.77716 0.14205 1188.9 0
13-Nov-2021 10:00:06 1.2542 0.73893 0.11437 1467.7 0

Accedi per commentare.

Risposta accettata

Matt J
Matt J il 2 Dic 2021
Modificato: Matt J il 2 Dic 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 Commento
Steven Lord
Steven Lord il 2 Dic 2021
Or you could just use islocalmax.
y = randi(50, 1, 10)
y = 1×10
33 47 24 14 33 16 47 28 32 16
[ y; ...
islocalmax(y); ...
false (y(2:end-1) > y(1:end-2)) & (y(2:end-1) > y(3:end)) false]
ans = 3×10
33 47 24 14 33 16 47 28 32 16 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by