2
有人可以幫助我提供一種有效的方法或幫助我執行提供的代碼,以儘可能最小的步驟做出相同的結果。我會感激你的。動態窗口在MATLAB中有效地形成
我有一個原始數組:
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];
輸出如下:
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];
我申請了一些限制,並刪除了一些值從後局部最大值的陣列我獲得了一些新的陣列。
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
安東尼:
你的最後一個循環,其修改
A
也可以集成到同一個循環,這樣你就可以擁有。非常感謝你的這麼好的,準確和成熟的答覆。它對我來說非常合適。感謝您爲我節省時間和精力。 – Peter