user2721434
user2721434

Reputation: 3

Matlab, values over specific y-range

In MATLAB, I would like to know what the best way is to get the x-range values over an specific y-range.

For example, if I have a graph of fluctuating temperature (y-axis) with respect to time (x-axis), I want to know how many times the temperature is above 550°C but below 600°C.
The temperature fluctuates over time, so many intervals between these temperatures can be found along the graph.

Upvotes: 0

Views: 816

Answers (1)

Dan
Dan

Reputation: 45741

I think you're looking for something like this:

T = rand(100,1); %Your temperature variable
c = (T > 0.2) & (T < 0.8); %Your threshholds, in your case switch the 0.2 for 550 and the 0.8 for 600
sum(diff([0; c]) == 1)

What's happening here is this: c = (T > 0.2) & (T < 0.8) creates a mask where points that are between your threshholds are 1 and points that are outside are 0. Now diff finds the difference between each adjacent point so for example diff([1 0 0 1 1 1 0]) will return -1 0 1 0 0 -1 but we only want to count each time our c vector goes from 0 to 1 (or we could count it going from 1 to 0, so long as we don't count both) hence the == 1. Finally we don't want to miss a gorup of ones starting at the beginning hence we add a 0 to the beginning.

EDIT:

Based on your comment and assuming you have a time vector called x and a temperature vector called y:

dx = x(2)-x(1) %I'm assuming this remains constant throughout x, i.e. x(n) - x(n-1) is constant
mask = (y >= 550) & (y <= 600)
totalTime = sum(mask)*dx

If the time differences in x are not constant then do this:

mask = (y >= 550) & (y <= 600)
dx = x(end) - x(end-1);
d = -diff([0;mask;0]).*[x; x(end)+dx];
totalTime = sum(d)

Upvotes: 1

Related Questions