2013-03-20 29 views
0

我想查找數組何時超過某個值的索引,並且此值超過了持續時間n。例如:matlab - 當值超過閾值時找到索引n次數

n = 5; 
dat = [1,2,2,1.5,2,4,2,1,1,3,4,6,8,4,9]; 

在這裏,我想找到什麼時候'dat'首次超過n的持續時間大於2。所以,這裏的解決方案應該導致一個答案:

ans = 10 

又如:

n = 7; 
dat = [1,1,2,3,4,5,6,7,8,9,9,6,4,3,2,4,6,7,7,5]; 

找到第一次「逸」超過或超過或等於n倍等於5。

ANS = 6

+0

你可能想說「在這裏,我想,當 '逸' 超過'或equals' 2找到這是第一次大於n的持續時間。「 – 2013-03-20 09:44:40

+0

然後我支持我的回答(編輯以反映新的「或等於」條款)。我看到你在演講中添加了一個演員陣容,現在我無法在matlab中檢查它,但我不認爲這是需要的。 matlab真的會拋出一個沒有它的錯誤? – Dan 2013-03-20 10:16:03

回答

2
n = 5; 
m = 2; 
dat = [1,2,2,1.5,2,4,2,1,1,3,4,6,8,4,9]; 

c = conv(double(dat >= m), ones(1, n)) 
%I think you can also do 
% c = conv((dat >= m)*1, ones(1, n)) 

min(find(c == n)) - n + 1 
+0

如果我直接複製到Matlab,我收到錯誤:錯誤使用conv2 第一個和第二個參數必須是單或雙。 轉化錯誤(第39行) c = conv2(a(:),b(:),shape); – KatyB 2013-03-20 10:24:43

+0

只測試它在八度(它工作),但非常驚訝它不工作在MATLAB。我會添加你建議的演員。可能的替代選擇只是爲了'。* 1'我認爲,值得一試。 – Dan 2013-03-20 10:29:03

1
n=5 
x=2; 
dat = [1,2,2,1.5,2,4,2,1,1,3,4,6,8,4,9]; 
vec= cumsum(dat>=x); 
ind=find(vec>=n); 
ind=dat(ind(1)); 

ind將包含答案10

+1

我們對這個問題有很不同的解釋。我認爲OP意味着連續有5個元素大於2,即(3,4,6,8,4)。 OP也許需要用第二個例子來說明。 – Dan 2013-03-20 09:55:22

+0

@Dan Ok。我明白。他希望價值不是指數。我將「第一次找到」解釋爲找到索引。回答編輯。另請注意,現在它是'> = x'以及'> = n'。所以他的第一個和第二個例子有不同的措辭。我的回答是根據他給出的最新例子。 – 2013-03-20 17:15:40