Since my variable changes size on every loop iteration, how do I preallocate memory?

7 views (last 30 days)
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

Accepted Answer

Image Analyst
Image Analyst on 5 Apr 2020
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

More Answers (1)

Ameer Hamza
Ameer Hamza on 5 Apr 2020
Edited: Ameer Hamza on 5 Apr 2020
From you code, it appear that Activity_dff is of same size as Activity_smooth
% Calculating Activity(k)-fd/fd for photometry
Activity_dff = zeros(size(Activity_smooth)); % <---- pre-allocation
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

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!