In a logical array find how the density of TRUE values increases

2 visualizaciones (últimos 30 días)
Supposedly we have a logical array:
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0];
The true values at the beginning are very few but the true values become more and more at the end of the array. Is there any way to identify the increasing density of the true values?
  6 comentarios
Azzi Abdelmalek
Azzi Abdelmalek el 7 de Ag. de 2013
Editada: Azzi Abdelmalek el 7 de Ag. de 2013
Giorgos, please, do not answer your question when you want to add a comment. Click on comment on this answer if you want to add a comment to any answer

Iniciar sesión para comentar.

Respuestas (4)

Image Analyst
Image Analyst el 6 de Ag. de 2013
You have to define density over some area (number of elements) because, obviously, the density changes depending on how many elements it's calculated over. For example, to calculate the density over a window size of 5, try this code:
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0];
density = conv(t, ones(1, 5)/5, 'valid')
plot(density, 'b-', 'LineWidth', 3);
grid on;
xlabel('Element', 'FontSize', 30);
ylabel('Density', 'FontSize', 30);
conv() is a function that will give the sum in the window and then divide by 5 so it gives the average value within the window of length 5.
  3 comentarios
Image Analyst
Image Analyst el 6 de Ag. de 2013
You can do that if you want.
% densityThreshold is some value you define.
aboveDensityThreshold = density > densityThreshold;
% Assign original data to false in those locations.
t(aboveDensityThreshold) = false;
Giorgos Papakonstantinou
Giorgos Papakonstantinou el 10 de Ag. de 2013
Thank you Image Analyst for your suggestion but I haven't solved yet my original problem neither with the "density" nor with the cumsum. I posted in the beginning of this thread my original question.
I would appreciate if you could take a look at it. And if there is something unclear I would be happy to explain it further.

Iniciar sesión para comentar.


Azzi Abdelmalek
Azzi Abdelmalek el 6 de Ag. de 2013
What you did in your previous comment is
sort(t)
I do not think this is what you want. Can you explain mathematically what is density?
  4 comentarios
Azzi Abdelmalek
Azzi Abdelmalek el 6 de Ag. de 2013
Editada: Azzi Abdelmalek el 6 de Ag. de 2013
Edit
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 ];
s=num2str(t)
s1=strrep(s,' ','')
n1=cellfun(@numel,regexp(s1,'1+','match'))
n2=cellfun(@numel,regexp(s1,'0+','match'))
stairs(cumsum(n1))
hold all
stairs(cumsum(n2))

Iniciar sesión para comentar.


Azzi Abdelmalek
Azzi Abdelmalek el 6 de Ag. de 2013
Editada: Azzi Abdelmalek el 6 de Ag. de 2013
%or maybe
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 ];
s=num2str(t)
s1=strrep(s,' ','')
n1=cellfun(@numel,regexp(s1,'1+','match'))
n2=-cellfun(@numel,regexp(s1,'0+','match'))
out=zeros(1,numel([n1 n2]))
out(1:2:2*numel(n1)-1)=n1
out(2:2:2*numel(n2))=n2
stairs(cumsum(out))
%or maybe
close
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 ];
t(t==0)=-1
stairs(cumsum(t))

Spencer Talbot
Spencer Talbot el 23 de Feb. de 2023
Editada: Spencer Talbot el 23 de Feb. de 2023
I know this question is old, but I recently had a similar question. Here's what I came up with:
t=[1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0];
density = zeros(length(t),2); % initialize the density matrix (1st column is # of consecutive TRUE instances, 2nd column is the index where that streak occurs)
k = 1; % initialize the index for keeping track of density
for i = 1:length(t)
if t(i)
density(k) = density(k,1) + 1; % if the current value is true, plus one count for density
if density(k,1) == 1
density(k,2) = i; % If it's the start of a new streak, record the index
end
else
k = k + 1; % if a streak ends, move on to the next index to prepare for a new streak
end
end
[max_density, idx] = max(density(:,1)); % find the value and starting index for the longest streak
range_idx = density(idx,2):density(idx,2) + max_density - 1; % compute the range of indices for which the max density streak lasts

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by