Pre-Allocate Space for a Cell Array

2 views (last 30 days)
Jessica
Jessica on 1 Aug 2014
Commented: Ben11 on 1 Aug 2014
I'm working with confocal microscopy images. Specifically Z-stacks. I want to manipulate the images. However, I'm having a problem preallocating the space in memory.
%Open Image
bfopen()
%Extract Image Data
image_data=ans{1,1};
%Create an Array focused on the pixel_data
pixel_data=image_data(:,1);
%Ask User How Many Laser Channels were used to Acquire the Image
total_laser_channels=input('How many laser channels were used to acquire this image?\n');
%Determine the number of image slices in each channel
images_per_channel=length(pixel_data)/total_laser_channels;
*
%Preallocate space and variables for each channel
if total_laser_channels==1
channel1{images_per_channel,:}=[];
elseif total_laser_channels==2
channel1{images_per_channel,:}=[];
channel2{images_per_channel,:}=[];
elseif total_laser_channels==3
channel1{images_per_channel,:}=[];
channel2{images_per_channel,:}=[];
channel3{images_per_channel,:}=[];
elseif total_laser_channels==4
channel1{images_per_channel,:}=[];
channel2{images_per_channel,:}=[];
channel3{images_per_channel,:}=[];
channel4{images_per_channel,:}=[];
elseif total_laser_channels==5
channel1{images_per_channel,:}=[];
channel2{images_per_channel,:}=[];
channel3{images_per_channel,:}=[];
channel4{images_per_channel,:}=[];
channel5{images_per_channel,:}=[];
else
break
end*
%Loop: Each laser channel has corresponding images
i=1;
while i<length(pixel_data)+1
if total_laser_channels==1
channel1=[channel1;pixel_data(i,1)];
i=i+1;
elseif total_laser_channels==2
channel1=[channel1;pixel_data(i,1)];
channel2=[channel2;pixel_data(i+1,1)];
i=i+2;
elseif total_laser_channels==3
channel1=[channel1;pixel_data(i,1)];
channel2=[channel2;pixel_data(i+1,1)];
channel3=[channel3;pixel_data(i+2,1)];
i=i+3;
elseif total_laser_channels==4
channel1=[channel1;pixel_data(i,1)];
channel2=[channel2;pixel_data(i+1,1)];
channel3=[channel3;pixel_data(i+2,1)];
channel4=[channel4;pixel_data(i+3,1)];
i=i+4;
elseif total_laser_channels==5
channel1=[channel1;pixel_data(i,1)];
channel2=[channel2;pixel_data(i+1,1)];
channel3=[channel3;pixel_data(i+2,1)];
channel4=[channel4;pixel_data(i+3,1)];
channel5=[channel5;pixel_data(i+4,1)];
i=i+5;
else
display('Too many or wrong number of laser channels.')
break
end
end
For the images i'm looking at now the total_laser_channels is 3. images_per_channel is 45. However for channel1, channel2, channel3 after i run the code i get a 46x1 array instead of the 45x1 array that i want.
[]
2048x2048 uint16
2048x2048 uint16
2048x2048 uint16
2048x2048 uint16
2048x2048 uint16
2048x2048 uint16
2048x2048 uint16....
The first position of the cell array has []
Any help would be greatly appreciated.
  1 Comment
Ben11
Ben11 on 1 Aug 2014
Maybe you could use a switch/case and a for loop? On a side note if you want to remove the empty array from your cell array you can use ths:
channel1 = channel1(~cellfun('isempty', channel1));

Sign in to comment.

Answers (0)

Community Treasure Hunt

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

Start Hunting!