Counting program every positive element

1 visualización (últimos 30 días)
Milosz Mart
Milosz Mart el 5 de Mzo. de 2016
Respondida: Image Analyst el 5 de Mzo. de 2016
Hello.
I have problem with one program and I even doesn't know how to start.
I have an array which is built with zeros and positive numbers. I want to know how many points there are between starting zero and zero ending of "the isle of positive numbers". To show my issue, I gave the image of one of my arraies and I want to get from it (from array which create this image...) matrix which have 3 columns (1col. start date/start point; 2col. end date/end point; 3col. how many points are between start date and end date N_i=...). The number of the rows is determined by how many "isles of positive numbers" have each array.
  3 comentarios
Milosz Mart
Milosz Mart el 5 de Mzo. de 2016
clear all; close all;
filename = 'C:\[...]\kwazi_data_1993.txt'
delimiter = '\t';
formatSpec = '%f%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN, 'ReturnOnError', false);
fclose(fileID);
data = dataArray{:, 1};
clearvars filename delimiter formatSpec fileID dataArray ans;
filename = 'C:\[...]\kwazi_data_1993.txt';
delimiter = '\t';
formatSpec = '%{yyyyMMddHH}D%*s%*s%*s%*s%*s%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN, 'ReturnOnError', false);
fclose(fileID);
DATA = dataArray{:, 1};
clearvars filename delimiter formatSpec fileID dataArray ans;
filename = 'C:\[...]\calk1993.txt'
delimiter = '\t';
formatSpec = '%f%f%f%f%f%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN, 'ReturnOnError', false);
fclose(fileID);
VarName1 = dataArray{:, 1};
clearvars filename delimiter formatSpec fileID dataArray ans;
for k=1:365
if VarName1(1:k,1)>0
KKK=VarName1(1:k,1);
else
KKK=VarName1(1:k,1)>=0
end
end
KK=KKK.*VarName1
Guillaume
Guillaume el 5 de Mzo. de 2016
Please remove all the blank lines you've inserted between each line of code, then select all the code and press the {}Code button. That will make your post a lot more readable.

Iniciar sesión para comentar.

Respuestas (3)

Guillaume
Guillaume el 5 de Mzo. de 2016
Editada: Guillaume el 5 de Mzo. de 2016
This is the common problem of finding the run length of a sequence. There are plenty of answers for this on this forum.
First, identify the sequence. For you it's positive numbers,
v = [0, rand(1, 20), -rand(1, 5), rand(1, 12), 0, rand(1,2)]; %demo data.
insequence = v > 0;
Points in the sequence are indicated by 1, points not in the sequence by 0. Therefore the start of a sequence is found when 0 is followed by 1, the end when 1 is followed by 0
transitions = diff([0 insequence 0]);
transitions is 1 for start of sequence, -1 for end of sequence. I've put 0 at each end to make sure you still have [0 1] or [1 0] if the sequence starts or ends with 1.
startsequences = find(transitions == 1)
endsequences = find(transitions == -1) - 1
Because of the 0 added on each end, you're guaranteed to have the same number of startsequences and endsequences

Andrei Bobrov
Andrei Bobrov el 5 de Mzo. de 2016
Editada: Andrei Bobrov el 5 de Mzo. de 2016
Let date1 - arrey with your dates, DATA - your data
f = fopen('kwazi_data_1993.txt');
c = textscan(f,'%s','delimiter','\n');
fclose(f);
date1 = c{:};
DATA = importdata('calk1993.txt');
i1 = [(1:numel(DATA))', bwlabel(DATA > 0)];
lo = i1(:,2) > 0;
a = accumarray(i1(lo,2),i1(lo,1),[],@(x){[min(x),max(x),numel(x)]});
b = cat(1,a{:});
out = [date1(b(:,1:2)), num2cell(b(:,3))];

Image Analyst
Image Analyst el 5 de Mzo. de 2016
To determine how many positive values are between index1 and index2 of your signal, you can do this
numPositives = sum(yourSignal(index1:index2) > 0);
If you have a bunch of these "runs" of positive values and don't know the starting and stopping indexes, then you can use regionprops to get the areas and indexes
labeledSignal = bwlabel(yourSignal > 0);
measurements = regionprops(labeledSignal, 'Area', 'PixelIdxValues');
allLengths = [measurements.Area];
allLengths will be a list of the lengths of each "run" of positive values.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by