Label segments based on percentage

6 visualizzazioni (ultimi 30 giorni)
Uerm
Uerm il 12 Dic 2019
Commentato: Uerm il 23 Dic 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?

Risposta accettata

Guillaume
Guillaume il 18 Dic 2019
Modificato: Guillaume il 18 Dic 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 Commento
Uerm
Uerm il 23 Dic 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.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 13 Dic 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 Commenti
Image Analyst
Image Analyst il 16 Dic 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
Uerm
Uerm il 18 Dic 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

Accedi per commentare.

Prodotti


Release

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by