deleting numbers in cell array

5 views (last 30 days)
I have a 32x5 cell array.
I want to delete all numbers (+/- 3 either side of each number) that do not appear in every column.
Is there a function that can help me?
Thanks
Sam
  6 Comments
sam van Bohemen
sam van Bohemen on 27 Feb 2020
I want to find all values (value-3 to value+3) that are not present in every column and then delete these values.
I will try to describe it step-by-step:
Say the matrix is:
10 11 10 28 9
39 40 41 40 39
58 47 58 57 59
68 58 68 69 70
1) starting with the first element of the matrix (10). I want to search the other 4 columns to determine if they all contain a number between 7 and 13 (10-3 and 10+3).
2) column two contains 11, column three contains 10 and column five contains 9. However there is no number between 7 and 13 in column four.
3) therefore I would delete all of these numbers (10 11 10 9).
4) I would then move on to '28'. none of the other columns contain any number between 25 and 31 (28-3 and 28+3). therefore I would delete 28
5) I would then move on to '39'. all five columns contain a number between 36 and 42 (39-3 and 39+3). therefore I would keep all of these numbers (39 40 41 40 39).
6) moving on to '58' all five columns contain a number between 55 and 61 (58-3 and 58+3). therefore I would keep all of these numbers (58 58 58 57 59).
7) moving onto '47' none of the other columns contain a number between 43 and 50 (47-3 and 47+3). therefore I would delete 47.
8) moving onto '68' all columns except column two contain a number between 65 and 71 (68-3 and 68+3). therefore I would delete all of these numbers (68 68 69 70).
9) This would leave me with:
NaN NaN NaN NaN NaN
39 40 41 40 39
58 NaN 58 57 59
NaN 58 NaN NaN NaN
10) I want to make it so all numbers move up when the number above it is deleted so all numers -3 to +3 are in the same row, as below:
39 40 41 40 39
58 58 68 69 70
Hope this make is more clear. Sorry it is so wordy

Sign in to comment.

Accepted Answer

Robert U
Robert U on 2 Mar 2020
Hi sam van Bohemen,
Thank you for your description. I guess the following code will do the trick:
dInput = [10 11 10 28 9; ...
39 40 41 40 39; ...
58 47 58 57 59; ...
68 58 68 69 70];
dInMin = dInput - 3;
dInMax = dInput + 3;
for numRow = 1:size(dInput,1)
for numCol = 1:size(dInput,2)
bRange = all(any(dInput(numRow,numCol) >= dInMin(:,[1:numCol-1,numCol+1:end]) & dInput(numRow,numCol) <= dInMax(:,[1:numCol-1,numCol+1:end]),1));
if ~bRange
dInput(numRow,numCol) = NaN;
end
end
end
bRowMoved = true;
while bRowMoved
for numRow = 2:size(dInput,1)
bRowMoved = false;
for numCol = 1:size(dInput,2)
if isnan(dInput(numRow-1,numCol))
dInput(numRow-1,numCol) = dInput(numRow,numCol);
dInput(numRow,numCol) = NaN;
bRowMoved = true;
end
end
end
dInput(all(isnan(dInput),2),:) = [];
end
Kind regards,
Robert
  1 Comment
sam van Bohemen
sam van Bohemen on 4 Mar 2020
Thanks so much Robert, your code worked!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!