1 view (last 30 days)

Show older comments

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?

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.

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

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

Start Hunting!