21 views (last 30 days)

Show older comments

I am having trouble writing a code for a condition that within every 20 consecutive days, find if a value greater than a defined threshold occurs at least 10 times. For example, I have a matrix called test_matrix (57x365; where each row represents a year and each column is a day). So for each of the 57 years, I want to find the values greater than a threshold (say value >5), and check whether they occur 10 or more times in every consecutive 20 days.

If the criteria is met, I'd like to know all the first days of the 20 day window (i.e., it may occur 3 times in a year, so I'd like to know those three days).

A bit hard to explain, so I am happy to clarify the question. Thanks!

Image Analyst
on 21 Nov 2015

Edited: Image Analyst
on 21 Nov 2015

First of all you need to convert the matrix into one long 1-D vector so you can find stretches than span New Year's Day. Then you simply use conv():

allDays = reshape(test_matrix', [1, numel(test_matrix)]);

% Find days more than a threshold of 5:

aboveThreshold = allDays >= 5;

% Make a moving window of 20 days to count the number of days above 5.

windowWidth = 20;

counts = conv(aboveThreshold, ones(1, windowWidth), 'same');

tenOrMore = counts >= 10;

Note that there there will be an offset so you have to see what it is. The counts is basically the counts when the window is centered at the location, but since you're not taking an odd number of elements in the window as is normal, there will be a half element shift and you'll need to figure that out.

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

Start Hunting!