Borrar filtros
Borrar filtros

How to delete a row if it doesn't follow a pattern

1 visualización (últimos 30 días)
Sha S
Sha S el 8 de Jul. de 2015
Comentada: Sha S el 15 de Jul. de 2015
Hi, I have... a = [ 2 5 1; 3 6 2; 3 4 1; 9 4 2; 8 3 1; 3 2 2; 9 5 2; 4 8 1]
Notice how the last column follows a pattern of 1, 2,1,2..and so on.
The 7th row however has a 2 in the last column just like the 6th row before...thus does not follow the pattern.
How would I delete the 7th row and any other row if it does not follow the 1,2,1,2 pattern of the last column?
Thanks.
  2 comentarios
James Tursa
James Tursa el 8 de Jul. de 2015
Is the pattern always two different numbers alternating? Or could it be something else?
Sha S
Sha S el 8 de Jul. de 2015
The pattern is always the numbers 1 and 2 alternating.

Iniciar sesión para comentar.

Respuesta aceptada

Ashmil Mohammed
Ashmil Mohammed el 8 de Jul. de 2015
Try out this code :
p=size(m,1);%m is your matrix
for i=1:p
if mod(i,2)==1 && m(i,size(m,2))~=mod(i,2)
m(i,:)=[];
p=p-1;
elseif mod(i,2)==0 && m(i,size(m,2))~=(mod(i,2)+2)
m(i,:)=[];
p=p-1;
end
end
  1 comentario
Sha S
Sha S el 10 de Jul. de 2015
Hi Ashmil, I have adjusted my data a bit...
a = [ 2 5 1 0.504; 3 6 2 0.507; 3 4 1 0.589; 9 4 2 0.503; 8 3 1 0.592; 3 2 2 0.203; 9 5 2 0.341; 4 8 1 0.592]
Notice how the 2nd last column follows a pattern of 1, 2,1,2..and so on. The 7th row however has a 2 in the 2nd last column just like the 6th row before...thus does not follow the pattern. I want to delete one of these two rows based on the value in the last column. I want to delete which ever row has a value in the last column further away from the number 0.500. I would want to delete any row where the 2nd last column does not follow the pattern 1,2,1,2 and when deciding between which row out of the two rows to delete...base it on whichever is further from the number 0.500. Thanks!

Iniciar sesión para comentar.

Más respuestas (2)

bio lim
bio lim el 8 de Jul. de 2015
a = [ 2 5 1; 3 6 2; 3 4 1; 9 4 2; 8 3 1; 3 2 2; 9 5 2; 4 8 1];
% First lets remove 2's in a row
ii = 1:2:length(a);
b = a(ii,end)~=1;
a(2*find(b==1)-1, :) = [];
% Second lets remove 1's in a row
jj = 2:2:length(a);
c = a(jj,end)~=2;
a(2*find(c==1)-1,:) = [];
Output is
a =
2 5 1
3 6 2
3 4 1
9 4 2
8 3 1
3 2 2
4 8 1

James Tursa
James Tursa el 8 de Jul. de 2015
Editada: James Tursa el 8 de Jul. de 2015
Assuming the pattern in the last column must be 1-2-1-2-...etc exactly
[m,n] = size(a);
expected = 1; % initialize expected value in 1st row
x = false(m,1); % initialize the deletion flag array
for k=1:m
if( a(k,n) ~= expected )
x(k) = true; % if not as expected, mark for deletion
else
expected = 3 - expected; % if as expected, update expected
end
end
a(x,:) = []; % delete the unexpected pattern rows
  2 comentarios
James Tursa
James Tursa el 8 de Jul. de 2015
Editada: James Tursa el 8 de Jul. de 2015
Note: My answer and coffee's answer differ in how they treat a matrix that starts with a 2 in the last column of row 1 (and potentially the adjacent rows). My answer will delete all beginning rows until a 1 is found. coffee's answer does something different. If you want to allow beginning with a 1 or a 2, alter the expected initialization line as follows (assumes a(1,n) has to be either a 1 or a 2 and can't be anything else):
expected = a(1,n); % initialize expected value in 1st row
Sha S
Sha S el 15 de Jul. de 2015
How would I change this if I wanted to delete the 6th row rather than the 7th row?

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by