# deleting numbers in cell array

6 views (last 30 days)
sam van Bohemen on 24 Feb 2020
Commented: sam van Bohemen on 4 Mar 2020
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
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

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
sam van Bohemen on 4 Mar 2020
Thanks so much Robert, your code worked!