how i can delete useless data from matrix
Mostra commenti meno recenti
hi guys,
i have a matrin m lines 11 columns.
i wish a new matrix where are deleted the lines when:
there are three lines row the same of the 8th columns and how the second condition the same but with 6 column. Like the the example in the insert.
from the 715 lines there is the problem that i would deley in the new matrix.
thanks
8 Commenti
Adam Danz
il 5 Feb 2019
Sorry, I'm having difficulty understanding. Maybe try again or provide an example?
Giuseppe Antonacci
il 5 Feb 2019
Modificato: Giuseppe Antonacci
il 5 Feb 2019
madhan ravi
il 5 Feb 2019
Illustration with an example will avoid the delay in answer https://www.mathworks.com/matlabcentral/answers/443329-how-i-can-delete-useless-data-from-matrix#comment_667952
Giuseppe Antonacci
il 5 Feb 2019
Bob Thompson
il 5 Feb 2019
Modificato: Bob Thompson
il 5 Feb 2019
So you want to remove the duplicates from the 8th and 6th columns. That's relatively easy to do by identifying the unique values using unique() and some logic indexing.
How are you deciding which row of the duplicates to keep. It looks like there are some differences in columns 1 and 5, so each row cannot be regarded as completely the same.
Guillaume
il 5 Feb 2019
Note that posting actual files instead of screenshots makes it much easier for us to give an answer that works. We can't copy/paste screenshots into matlab to test our answers. We can use actual files (I assume the input is an excel file or similar, here).
Giuseppe Antonacci
il 5 Feb 2019
Guillaume
il 5 Feb 2019
It's very unlikely that you need loops and if statement. If the matrix is too big, attached a smaller one which still has enough data to show what you want.
I'm with Bob, I'm really unclear on what you want. So attach a simple example of input and the corresponding desired output.
Risposte (2)
Bob Thompson
il 5 Feb 2019
Modificato: Bob Thompson
il 5 Feb 2019
0 voti
Here is something to try. Probably not the most efficient, but it should do what you're asking.
vals = unique(data(:,8));
data2 = [];
for i = 1:length(vals);
if size(data(data(:,8)==vals(i),:),1)<=3
data2 = [data2; data(data(:,8)==vals(i),:)];
else
tmp = data(data(:,8)==vals(i),:);
data2 = [data2; tmp(1:3,:)];
end
end
I would agree with Guillaume that extra explanation would be helpful. If this loop combo does what you're looking for we can probably come up with some way of doing this without the loops, just let us know.
Do NOT use a loop for this.
MATLAB code should be neat and simple:
[~,idx] = unique(data(:,[6,8]),'stable','rows');
out = data(idx,:)
Because you have floating point numbers, I recommend either using uniquetol, or scale the values and round them before unique.
3 Commenti
Giuseppe Antonacci
il 7 Feb 2019
Download Jan Simon's excellent RunLength here:
and use it like this:
>> M = [21,42,38,29;29,39,41,29;23,3,2,18;15,3,2,31;24,3,2,48;51,35,24,22;21,42,38,29;29,39,41,29;23,3,2,18;15,3,2,31;51,35,24,22]
M =
21 42 38 29
29 39 41 29
23 3 2 18
15 3 2 31
24 3 2 48
51 35 24 22
21 42 38 29
29 39 41 29
23 3 2 18
15 3 2 31
51 35 24 22
>> R = 3; % >=R identical rows will be deleted.
>> X = all(diff(M(:,[2,3]),1,1)==0,2); % check columns 2 & 3.
>> [B,N] = RunLength([false;X]|[X;false]);
>> B(N(:)<R & B) = false;
>> Y = repelem(B,N)
>> M(Y,:) = [] % remove rows
M =
21 42 38 29
29 39 41 29
51 35 24 22
21 42 38 29
29 39 41 29
23 3 2 18
15 3 2 31
51 35 24 22
Giuseppe Antonacci
il 7 Feb 2019
Categorie
Scopri di più su Logical in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
