1 view (last 30 days)

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

Image Analyst
on 16 Dec 2019

OK, the picture helped. Try this:

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

num1sPerRow = sum(thisCellsContents == 1, 2); % This is a N row vector.

% See if the number of them is 30% or more of the columns.

fractionContaining1 = num1sPerRow / columns;

fprintf('The highest fraction of ones any row in matrix #%d has is %.2f.\n', k, max(fractionContaining1));

% Say what rows need to be set to 1 and which need to be set to zero.

indexesToSetTo1 = fractionContaining1 > 0.3;

if any(indexesToSetTo1)

fprintf('Setting cell #%d to a %d-row column vector\n', k, rows);

output{k} = indexesToSetTo1; % Make vector of 0's and 1's

else

fprintf('Leaving cell #%d alone.\n', k);

output{k} = thisCellsContents; % Just the original contents.

end

end

% Overwrite input, if desired.

% AL_128 = output

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.