2017-10-19 11 views
2

効率的な方法の提供や、最小限の手順で同じ結果を得るための提供コードの実行に役立つ人がいますか?私はあなたに感謝します。MATLABで効率的な動的ウィンドウの作成

私は元の配列を持っている:

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]; 

私はいくつかの制限を適用し、私はいくつかの新しい配列を受けた後に極大値の配列からいくつかの値を削除:

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]; 

出力は次のようになります。

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

ここで、idx(ローカル最大値)が見つかるはずだが、値が大きいほど前方が大きいとチェックする。

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. 

私が極大値と、今後の極大値の背後にある値の範囲を見つける必要があります。

問題なく動作するコードを作成しようとしましたが、長すぎます。

この操作を最小限の手順で、より速い方法で実行するためのアイデアはありますか?

私は負のローカルマキシマコードと同様に正のローカルマキシマのコードを提供しています。これだけのレプリカです。

コード:のみ正のローカル極大値について

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 

答えて

1

あなたのコードを初めて目から、私はあなたがいずれかにループのためのあなたの最初の二つを組み合わせることができます信じています。ここ

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 

、指定した条件に一致する配列の要素、すなわち、g <= numel(X)又はA(f) <= idx(i)を見つけるためにfindを使用することができます。あなたが持つことができるようにAを修正

あなたの最後のループも、同じループに統合することができます:最初の私は離れて私のPCからあったように、全てのビットを気の毒に返事が遅れの

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

アンソニー。あなたのような偉大で正確で成熟した返信に感謝します。それは私のために完璧に働いた。私のためにあなたの時間と労力を節約してくれてありがとう。 – Peter

関連する問題