keep element greater than immediate previous element
    9 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    HYZ
 il 24 Mag 2020
  
    
    
    
    
    Commentato: Thiago Henrique Gomes Lobato
      
 il 24 Mag 2020
            Hi,
x = [1 2 3 4 3 2  3 4 6 8  5   5  6  8.5  9  11 12 ]; I want to keep one vector whereby the next element is greater than the immediate previous element. keep = [[1 2 3 4 6 8 8.5 9 11 12 ]; to discard if the element is smaller than or equal to the immediate previous element. discard = [3 2 3 4 5 5 6] (the bold elements in x). 
I am using loop to do that and I didn't get what I want. could help modify my code or advise any alternative way? thanks in advance!
clc; clear; close all
x = [1 2 3 4 3 2  3 4 6 8  5  5 6 8.5  9  11 12 ];
m = length(x);
k=1; n = 1; i =1; j=2;
while i < m-1  & j < m      
        if x(j) >= x(i)
         keep(n) = x(j);   
          n=n+1; 
          i=i+1;
          j=j+1;
        elseif x(j) < x(i)
            discard(k) = x(j);
            k = k+1;
            i=i;
            j=j+1;
        end
end
0 Commenti
Risposta accettata
  Thiago Henrique Gomes Lobato
      
 il 24 Mag 2020
        This loops does what you want:
x = [1 2 3 4 3 2  3 4 6 8  5  5 6 8.5  9  11 12 ];
m = length(x);
keep = [x(1)];
discard =[];
for idx=2:m
    if x(idx)>keep(end)
        keep = [keep,x(idx)];
    else
        discard = [discard,x(idx)];
    end
end
keep
discard
keep =
    1.0000    2.0000    3.0000    4.0000    6.0000    8.0000    8.5000    9.0000   11.0000   12.0000
discard =
     3     2     3     4     5     5     6
Although, depending of your goal, simply sorting the array could solve the problem in a more simplified way:
keep = unique(sort(x))
keep =
    1.0000    2.0000    3.0000    4.0000    5.0000    6.0000    8.0000    8.5000    9.0000   11.0000   12.0000
2 Commenti
  Thiago Henrique Gomes Lobato
      
 il 24 Mag 2020
				In mine matlab version it works fine, it can be that older versions have some problems with double indexing in cell array. One thing you could try is to remove the variables from the cell whenever possible until you get no error anymore, ex:
x1 = [1 2 3 4 3 2  3 4 6 8  5  5 6 8.5  9  11 12 ];
x2 = [1 2 3 4 3 2  3 4 6 8  5  5 6 8.5  9  11 12 ];
X = cell(2,1);
X{1} = x1;
X{2} = x2;
keep = cell(2,1);
for i = 1: length(X)
    keep{i}(1) = [X{i}(1)];
    actualX    = X{i};
    for idx = 2:length(actualX)
        actualkeep = keep{i};
        actualkeep = actualkeep(end);
        if actualX(idx) > actualkeep
          keep{i} = [keep{i},X{i}(idx)];
        end
    end
end
Although I would remain with the vectorized solution I suggested if all you want is the keep array
Più risposte (1)
  per isakson
      
      
 il 24 Mag 2020
        An alternative
%%
x = [1 2 3 4 3 2  3 4 6 8  5   5  6  8.5  9  11 12 ];
%%
dx = 1;
while not( isempty( dx ) )
    dx = find((diff(x)<=0));
    x(dx+1)=[];
end
disp( x )  
output
  Columns 1 through 5
            1            2            3            4            6
  Columns 6 through 10
            8          8.5            9           11           12
>> 
0 Commenti
Vedere anche
Categorie
				Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


