Gopi
Gopi

Reputation: 369

How to avoid for loops in this code to improve computation time

In this code, I have a cluster image with 10 classes and i want to extract 10 different images for each level and save as a 10 images Below is the code, I used

tic
numberOfClasses = 10;
segment_label_images = cell(1,numberOfClasses);
pixelCount = zeros(1,numberOfClasses);
[rs, cs] = size(classImage);
% classImage has intensity range from 1-numberOfClasses
for k = 1:numberOfClasses
    for i = 1:rs
        for j = 1:cs
            if classImage(i,j) == k
                segment_label_images{k}(i,j) = 1;
            else
                segment_label_images{k}(i,j) = 0;
            end
        end
    end
pixelCount(k) = sum(segment_label_images{k}(:));
%figure, imshow(segment_label_images{k},[]);
end
toc

Here, I have 3 for loops and I think that is affecting computational time. Elapsed time is 0.089413 seconds.

Any suggestions to avoid for loop to improve comp time.? Thanks, Gopi

Upvotes: 0

Views: 42

Answers (2)

beaker
beaker

Reputation: 16791

Assuming MATLAB 2016b (or Octave):

k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = (classImage == k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));

For pre-2016b MATLAB, just add bsxfun:

k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = bsxfun(@eq, classImage, k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));

Of course, both of these leave segment_label_images as a 3D array rather than a cell array. Given that all of the arrays are the same size, I prefer to work with multi-dimensional arrays rather than cell arrays, for speed and convenience. It can, of course, be converted to a cell array if necessary.

Upvotes: 0

flawr
flawr

Reputation: 11628

Assuming classImage is a matrix you could speed it up with

for k = 1:numberOfClasses
    segment_label_images{k} = classImage == k;
    pixelCount(k) = sum(segment_label_images{k}(:));
end

Upvotes: 3

Related Questions