2015-08-17 50 views
0
陣列內找齊

我有以下矢量A查找中間位置的點的持續時間在Matlab

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204]; 

對於n = 2,我計數的元素大於或等於15內A

D = cellfun(@numel, regexp(char((A>=15)+'0'), [repmat('0',1,n) '+'], 'split')); 

以上表達式給出以下輸出作爲持續時間值:

D = [3 2 7 4 6] = [A(1:3) **stop** A(7:8) **stop** A(12:18) **stop** A(22:25) **stop** A(28:33)]; 

上述算法通過計算大於或等於15的元素來計算持續時間值。計數還允許在每個持續時間事件內少於2個小於15的連續元素(n = 2)。當連續的兩個或更多元素小於15並在A內的下一個子串重新開始時,計數器停止。

這裏提供Find median position points of duration events溶液A(1:3)後2個或更多連續的數字小於15(3在這種情況下)的行中的最後一個號分配給下一個子A(7:8),並與其他子串相同的,這是不計算持續時間事件的正確方法。

我想辦法找時間事件A(1:3)A(7:8)A(12:18)A(22:25)A(28:33),這是正確計算的中間位置點。結果應該是這樣的:

a1 = round(median(A(1:3))) = 2; 
a2 = round(median(A(7:8))) = 8; 
a3 = round(median(A(12:18))) = 15; 
a4 = round(median(A(22:25))) = 24; 
a5 = round(median(A(28:33))) = 31; 
+0

可以解釋爲什麼輪(中間值(A(1:3)))= 2?你只想要索引的中位數? – GameOfThrows

+0

@Bowecho - 轉發問題不是它在這裏如何工作。在最壞的情況下,版主會採取行動。你應該做的:澄清你的第一個問題,並儘可能多地添加細節,然後提供賞金。這樣你的問題得到了一週的充分重視,你一定會得到答案。 – thewaywewalk

+0

@thewaywewalk我會盡力做到這一點。 – Bowecho

回答

0

這是我的解決方案,它可能是愚蠢的(使用while循環...),但基本上解決了這個問題。

該過程是首先加上每2個連續的整數,如果他們的總和小於30,那麼必須有2個或更多個小於15的整數。如果總和大於30,那麼可以有1或0個小於15的整數。 - 注意:只有當你有正數時,如果存在負數,這個解決方案是錯誤的,這纔是真的!

A = [34 35 36 5 6 7 78 79 7 9 10 80 81 82 84 85 86 102 3 4 6 103 104 105 106 8 11 107 201 12 202 203 204]; 
A1 = A(1:end-1); 
A2 = A(2:end); 
B = A1+A2; 
C = find(B<30); 
Cmod = [1,C,size(A,2)]; 
counter = 1; 
j = 1; 

while counter < size(Cmod,2) 
    temp = Cmod(:,counter):Cmod(:,counter+1)-1; 
    if size(temp,2) < 2 
     counter=counter+1; 
    else 
     a(j) = round(median(temp(3:end))); 
     counter = counter+1; 
     j=j+1; 
    end 
end 
a(1) = a(1)-1; %this compensate the position shift in A1 and A2 
a(end) = a(end)+1; 

輸出是一個向量讀取:

a = 

>>2  8 15 24 31 
+0

感謝您的回答。我想概括一下這個解決方案,這意味着我希望能夠輕鬆地改變小於15的連續元素的數量。 – Bowecho

+0

所以我不知道我怎麼能概括你的解決方案。 – Bowecho

+0

@Bowecho該解決方案僅適用於2個連續元素,因爲您沒有指定您需要一個通用解決方案,所以此解決方案非常高效(除了while循環)。 – GameOfThrows

相關問題