MATLAB: Since the variable changes size on every loop iteration, how to preallocate memory

MATLABmatricespreallocation

MATLAB says that my variable activity_dff changes size on every loop iteration and for this reason I should consider preallocating. I do know the size of the array before the for loop begins (I do know it'll always have 1 row and n columns, where n is equal to the number of rows of another variable Activity_smooth), so I should probably preallocate it and then shrink it afterwards by doing: X = X(1:n,:);
%% Calculate dff

fd = prctile(Activity_smooth,10); %baseline, f0

% Calculating Activity(k)-fd/fd for photometry

for k = 1:length(Activity_smooth)
Activity_dff(k) = (Activity_smooth(k)-fd)/fd;
end
Activity_dff_ds = group_z_project_vector(Activity_dff,2560); %to see in epoch

end
Is the following code correct? And how do I make sure it's faster than the previous one?
%% Calculate dff
fd = prctile(Activity_smooth,10); %baseline, f0
% Calculating Activity(k)-fd/fd for photometry
Activity_dff = zeros(1,1000000);
for k = 1:length(Activity_smooth)
Activity_dff(k) = (Activity_smooth(k)-fd)/fd;
end
Activity_dff = Activity_dff(:,1:length(Activity_smooth));
Activity_dff_ds = group_z_project_vector(Activity_dff,2560); %to see in epoch
end

Best Answer

You can do this:
%% Calculate dff

fd = prctile(Activity_smooth,10); %baseline, f0

% Calculating Activity(k)-fd/fd for photometry
Activity_dff = zeros(1, length(Activity_smooth));
for k = 1:length(Activity_smooth)
Activity_dff(k) = (Activity_smooth(k)-fd)/fd;
end
Activity_dff = Activity_dff(1:length(Activity_smooth));
Activity_dff_ds = group_z_project_vector(Activity_dff,2560); %to see in epoch

or even better, get rid of the loop and other unneeded stuff:
%% Calculate dff
fd = prctile(Activity_smooth,10); %baseline, f0
Activity_dff = Activity_smooth-fd ./ fd;
Activity_dff_ds = group_z_project_vector(Activity_dff,2560); %to see in epoch