MATLAB Answers

# Label segments based on percentage

1 view (last 30 days)
Uerm on 12 Dec 2019
Commented: Uerm on 23 Dec 2019
Hi,
I have a variable (AL_128 which I have attached). It is a 1x48 cell where each cell is a Ax20 matrix. The matrices contain the values 0 and 1. For instance, cell 1 is a 225x20 matrix which should be interpret as follows: 225 segments where each segment is of length 20.
What I want to do here is to say that if 30% of the segments contain the label 1, the whole segment should be labelled 1. Therefore, cell 1 will end up being a 225x1 vector. This should be done for all segments and all cells.
How can I do that?
##### 0 CommentsShowHide -1 older comments

Sign in to comment.

### Accepted Answer

Guillaume on 18 Dec 2019
Edited: Guillaume on 18 Dec 2019
Much simpler code:
threshold = 0.3; %30% threshold
M = cellfun(@(m) mean(m, 1) >= threshold, AL_128, 'UniformOutput', false)
Or if you really want to use a loop over the cell array:
M = cell(size(AL_128));
for cidx = 1:numel(AL_128)
M{cidx} = mean(AL_128{cidx}, 1) >= threshold;
end
There is certainly no need to loop over the columns of the matrix.
##### 1 CommentShowHide None
Uerm on 23 Dec 2019
Thanks a lot, both of you!
In my case it would be
threshold = 0.3; %30% threshold
M = cellfun(@(m) mean(m, 2) >= threshold, AL_128, 'UniformOutput', false)
as I do the calculation along the rows.

Sign in to comment.

### More Answers (1)

Image Analyst on 13 Dec 2019
Your data didn't seem to have any segments where the value was 1, at least in the several cells I looked in, but I think this should work and be pretty easy to follow and understand.
s = load('AL_128.mat')
AL_128 = s.AL_128
% Define output cell array
output = cell(size(AL_128));
for k = 1 : length(AL_128)
% Get the contents of this cell
thisCellsContents = AL_128{k}; % This is an N rows - by - 20 columns matrix.
[rows, columns] = size(thisCellsContents); % Get the number of rows and columns in this matrix.
% See which rows contain a 1 in any column
containsA1 = any(thisCellsContents == 1, 2); % This is a N row vector.
% See if the number of them is 30% or more of the rows
fractionContaining1 = sum(containsA1) / rows;
if fractionContaining1 >= 0.3
output{k} = ones(rows, 1); % Make vector of all 1's
else
output{k} = thisCellsContents; % Just the original contents.
end
end
% Overwrite input, if desired.
AL_128 = output
##### 10 CommentsShowHide 9 older comments
Uerm on 18 Dec 2019
Thanks a lot! I found that this works too:
function M = threshold(AL_128,n)
for i = 1:length(AL_128)
for k = 1:size(AL_128{1,i},1)
M{i}(k,:) = double(mean(AL_128{1,i}(k,:))>=(n/100));
end
end

Sign in to comment.

R2019b

### Community Treasure Hunt

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

Start Hunting!