For loop to evaluate Root Mean Square
Show older comments
For every row of C I want to find all the elements in column A that are in a time window (centered on the first element of column A at the first iteration) of 4 minutes. Second iteration is find all the elements in column A that are in a time window (centered on the second element of column A) of 4 minutes. And so on for all rows of C table.
After doing that, I want to delete all outputs that are equal mantaining one for type and compute root mean square on every output remaining.
Attached a dummy table for the code, I think this is relatively easy to do with a for loop but I don't know how to implement it, other solution are well accepted,
Thanks in advance
6 Comments
darova
on 9 Apr 2020
Here is a start of using for loop
s = 0;
k = 0;
for i = 1:n
if v(i) > 0
s = s + v(i)^2;
k = k + 1;
end
end
result = sqrt(s/k);
Emiliano Ascenzi
on 10 Apr 2020
Rik
on 10 Apr 2020
You lack a clear description of your variables. The mat file you share only contains a single column of datetime values. Where are your values? Where are you start_time and end_time arrays?
It looks like you can fairly easily do this with an array operation, but without a better description of your data it is hard to help you.
Emiliano Ascenzi
on 11 Apr 2020
Rik
on 11 Apr 2020
Your code has multiple issues, so it will not run with the data you provided. Either provide working code (and explain how it should be sped up/optimized/extended), or provide a full example where you describe the steps you want to take in words.
Do you want to select all values in a 4-minute window, essentially performing a sliding window operation? If so, why would you need Tstart and Tstop?
Emiliano Ascenzi
on 11 Apr 2020
Edited: Emiliano Ascenzi
on 11 Apr 2020
Answers (1)
Jeff Miller
on 10 Apr 2020
I don't really understand what you mean by conditions, but maybe you can get what you want by thinking of a 2-step process where the first step is to pick out the rows you want and the second step is to get the rms. This code snippet illustrates it:
stopTime = datetime(2020,1,5,8,15,0); % set these according to your conditions, possibly in for loop
startTime = datetime(2020,1,5,7,45,0);
wantRows = (T>startTime) & (T<stopTime);
y = rms(x(wantRows));
8 Comments
Emiliano Ascenzi
on 11 Apr 2020
Jeff Miller
on 11 Apr 2020
Sorry, I really cannot tell what you are trying to do from looking at your code. For example, you make G as a new table each time through the loop but you don't save it or anything computed from it.
From your description, my guess is that you want something like this (but I'm not at all sure):
rmsA = zeros(height(C),1);
for i=1:height(C)
tf = isbetween(C.T(i),C.T(i)-2,C.T(i)+2);
xA = C.A(tf);
rmsA(i) = rms(xA);
end
Emiliano Ascenzi
on 11 Apr 2020
Edited: Emiliano Ascenzi
on 11 Apr 2020
Rik
on 11 Apr 2020
@Jeff, looks like that's what he should mean, although you can't just subtract 2, because that would subtract 2 entire days.
rmsA = zeros(height(C),1);
for i=1:height(C)
tf = isbetween(C.T(i),C.T(i)-minutes(2),C.T(i)+minutes(2));
xA = C.A(tf);
rmsA(i) = rms(xA);
end
Emiliano Ascenzi
on 11 Apr 2020
Edited: Emiliano Ascenzi
on 11 Apr 2020
Rik
on 11 Apr 2020
But that is already contained in the logical array tf.
Emiliano Ascenzi
on 11 Apr 2020
Edited: Emiliano Ascenzi
on 11 Apr 2020
Emiliano Ascenzi
on 11 Apr 2020
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!