Filter löschen
Filter löschen

Select subset of data going backwards

3 Ansichten (letzte 30 Tage)
chels19
chels19 am 23 Jun. 2016
Kommentiert: chels19 am 24 Jun. 2016
Hi, I've got a matrix of data and need to start at a specific row within the dataset and, based on a condition, select the previous 5 rows. For example:
if column 6 > 0
a = iterate through and get the value of column 4 that corresponds to column 6 > 0 (i.e. 694)
starting at position a, get the previous 5 rows of data from column 4 where column 3 = 1
iterate through the whole file
In this case I would expect 361, 360, 349, 343, 331 to be returned (yellow).
What I really need to do is get the mean of these numbers but I need to select them first.
I hope I've explained it well. I'm just really stuck on how to go backwards in Matlab.
Thanks

Akzeptierte Antwort

rocketboyjka
rocketboyjka am 23 Jun. 2016
Bearbeitet: rocketboyjka am 23 Jun. 2016
Try this:
targetIndex = find(myMatrix(:,6) > 0);
desiredData = myMatrix(targetIndex-5:targetIndex-1,4);
If there is more than one location in your matrix where the condition is met, then targetIndex will be a vector of indices where the condition occurs and you could adapt it like this:
targetIndex = find(myMatrix(:,6) > 0);
for ii = 1:length(targetIndex)
desiredData(:,ii) = myMatrix(targetIndex(ii)-5:targetIndex(ii)-1,4);
end
Then each column will be the numbers that met your condition.
  4 Kommentare
rocketboyjka
rocketboyjka am 24 Jun. 2016
I missed your part about sorting by column 3. I tested this on your data. Should work if you're still looking.
targetIndex = find(myMatrix(:,6) > 0);
for ii = 1:length(targetIndex)
candiateRows = find(myMatrix(1:targetIndex(ii)-1,3) ~= 0);
if length(candiateRows) < 5
startIndex = 1;
numRows = length(candiateRows);
else
startIndex = length(candiateRows)-4;
numRows = 5;
end
desiredData(:,ii) = myMatrix(candiateRows(startIndex:end),4);
end
chels19
chels19 am 24 Jun. 2016
That works perfectly, thank you.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Thorsten
Thorsten am 23 Jun. 2016
i1 = find(a(:,6) > 0, 1, 'first')
i2 = find(a(1:i1, 3) == 1, 5, 'last')
res = flipud(a(i2, 4))
  1 Kommentar
chels19
chels19 am 23 Jun. 2016
Thanks. It is returning a number but I'm having trouble looping it. I tried to combine yours with the answer below but it's not working. With the data I have, I would expect 4 subsets of data.
What I really need to do is get the mean of these numbers but I want to check first that the correct 5 are being selected.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Startup and Shutdown finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by