2017-10-19 10 views
2

Quelqu'un peut-il m'aider à fournir un moyen efficace ou m'aider à exécuter le code fourni pour faire les mêmes résultats dans les étapes minimales possibles. Je te serai reconnaissant.Fenêtre dynamique formant de manière efficace dans MATLAB

J'ai un tableau original:

A = [1 1 1 4.3 4.5 4 4.3 3 1 0 0 2 6.2 6.3 6 6.2 7.4 8 7.2 2 2 3 3 2]; 

résultat ressemble à:

A = [1 1 1 4 4 4 4 3 1 0 0 2 6 6 6 6 6 7 7 2 2 3 3 2]; 

J'applique certaines restrictions et supprimé certaines valeurs du tableau des maxima locaux de suite que j'ai reçu quelques nouveaux tableaux.

Yposlocfiltered = [6 15 23]; 
idx    = [4  6  3]; 
Yneglocfiltered = [2  9 20]; 
idx_neg   = [1  1  2]; 

Où je trouverai IDX (valeur maxima locaux) Je vais vérifier si les valeurs sont derrière et devant plus faire une fenêtre.

Exemple

If I will find 4 and 4.5, 4.3 is greater than 4 include it in backward window 
4.3 is greater than 4 include it in forward window. 

Je dois trouver plage de valeurs derrière maxima et maxima locaux avant local.

J'ai essayé d'écrire un code qui fonctionne bien, mais le problème c'est qu'il est trop long.

Quelqu'un peut-il me donner une idée pour effectuer cette action dans les étapes minimales et de manière plus rapide?

J'ai seulement fourni le code pour les maxima locaux positifs comme pour le code de maximum local négatif Est juste la réplique de ceci.

code: uniquement pour les maximas locaux positifs

clc 
clear all 

A = [1 0 1 4.3 4.5 5 4.3 3 0 0 0 2 6.2 6.3 7 6.2 7.4 8 7.2 1 2 3 4 2]; 
Yposlocfiltered = [ 6 15 23]; 
idx = [4  6  3]; 
Yneglocfiltered = [2  9 20]; 
idx_neg = [1  1  2]; 

for b = 1: numel(idx) 
for c = 1:numel(A) 
f = Yposlocfiltered(1,b)-c ; 
g = Yposlocfiltered(1,b)+c ; 

% if (f > 0 && g <= numel(X)) 
if(f > 0) 
if (A(Yposlocfiltered(1,b)-c))> idx(1,b) 

else 
    d= f+1; 
    z(b)= d; 
    backward_window = z; 
    break 
end   

end 

end 

end 

for r = 1: numel(idx) 
for s = 1:numel(A) 
u = Yposlocfiltered(1,r)-s ; 
v = Yposlocfiltered(1,r)+s ; 

% if (f > 0 && g <= numel(X)) 
if(v <=numel(A)) 
if (A(Yposlocfiltered(1,r)+s))> idx(1,r) 

else 
    w= v-1; 
    y(r)= w; 
    forward_window = y; 
break 
end   

end 

end 

end 

n=4 
for i=1:length(backward_window) 
range = backward_window(i): forward_window(i); 
p = range 
if n <= numel(p) 
     p = range(1:n) 
     A(p) = idx(i); 
else 
% if (size(range)<= 3) 
A(p) = idx(i); 
end 
end 

Répondre

1

Dès le premier coup d'oeil à votre code, je crois que vous pouvez combiner vos deux premières pour les boucles en un seul.

sA = numel(A); 
sI = numel(idx); 

for i = 1:sI 
    f = Yposlocfiltered(i) - [1:sA]; 
    g = Yposlocfiltered(i) + [1:sA]; 
    f(f<1) = []; 
    g(g>sA) = []; 
    backward_window(i) = f(find(A(f) <= idx(i), 1)) + 1; 
    forward_window(i) = g(find(A(g) <= idx(i), 1)) - 1; 
end 

Ici, vous pouvez utiliser find pour localiser l'élément d'un tableau correspondant à la condition spécifiée, à savoir g <= numel(X) ou A(f) <= idx(i).

Votre dernière boucle qui modifie A peut également être intégré dans la même boucle, donc vous pouvez:

sA = numel(A); 
sI = numel(idx); 

n=4; 
for i = 1:sI 
    f = Yposlocfiltered(i) - [1:sA]; 
    g = Yposlocfiltered(i) + [1:sA]; 
    f(f<1) = []; 
    g(g>sA) = []; 
    backward_window(i) = f(find(A(f) <= idx(i), 1)) + 1; 
    forward_window(i) = g(find(A(g) <= idx(i), 1)) - 1; 
    range = backward_window(i) : forward_window(i); 
    if n <= numel(range) 
     A(range(1:n)) = idx(i); 
    else 
     A(range) = idx(i); 
    end 
end 
+2

Anthony d'abord désolé pour un peu en retard réponse que je suis loin de mon PC. Merci beaucoup pour votre réponse si belle et précise et mature. Cela a fonctionné parfaitement pour moi. Merci d'avoir épargné votre temps et vos efforts pour moi. – Peter