2013-06-29 85 views
4

我正在嘗試編寫一個簡單的MATLAB程序,它將查找連續非零值的第一個鏈(超過70個)並返回該連續鏈的起始值。找到連續的非零值

我正在從操縱桿獲取運動數據,並且在實際試驗開始前(來自受試者在試驗實際開始之前輕微移動操縱桿)之前有幾千行數據與零和非零值的混合。

我需要擺脫這些行,然後才能開始分析試驗中的運動。

我相信這是一個相對簡單的事情,所以我希望有人能提供見解。 預先感謝您

編輯:這裏是我的嘗試:

s = zeros(size(x1)); 

for i=2:length(x1) 
    if(x1(i-1) ~= 0) 
     s(i) = 1 + s(i-1); 
    end 
end 

display(S); 

對其中有72最大鏈矢量X1,但我不知道如何找到最大鏈,並返回它的第一個值,所以我知道在哪裏修剪。我也不認爲這是最好的策略,因爲我的數據中的最大鏈將會有數以萬計的價值。

+1

歡迎來到SO。在這裏,參考[tour](http://stackoverflow.com/about)。你有什麼嘗試? –

+0

s =零(size(x1));對於i = 2: 如果(x1(i-1)= 0) s(i)= 1 + s(i-1) end end display(S);對於最大鏈條數爲72的矢量x1,但我不知道如何找到最大鏈並返回其第一個值,所以我知道在哪裏修剪。謝謝 – thymeandspace

+0

沒問題。不過,我編輯了您的帖子以刪除該感謝信。這個問題並不「恰當」。 –

回答

1

你並不需要使用一個輔助載體,以跟蹤指數:

for i = 1:length(x) 
    if x(i) ~= 0 
      count = count + 1; 
    elseif count >= 70 
      lastIndex = i; 
      break; 
    else 
      count = 0; 
    end 

    if count == 70 
      index = i - 69; 
    end 
end 

x刪除所有鏈中的元素,你可以簡單地做:

x = x([lastIndex + 1:end]); 

編輯(基於評論):
你這樣做的方式沒有奏效的原因是因爲你沒有重置計數器,當你跑到0,這就是:

else 
    count = 0; 

是爲;如果您願意,它會重置該流程。 對於一些更清晰,在你的原代碼,這會被反映:

if x1(i-1) ~= 0 
     s(i) = 1 + s(i-1); 
    else 
     s(i) = 0; 
    end 
+0

希望編輯幫助! –

+1

輝煌,非常感謝。 – thymeandspace

+0

沒問題。祝你的研究成功。 –

2

這個答案是通用的任何連鎖規模。它找到矢量x1中最長的鏈並檢索該鏈的第一個元素val

首先,我們將使用bwlabel標記連接的部件,例如:

s=bwlabel(x1); 

然後我們可以使用tabulate獲得的s頻率表,發現最大的連接組件的第一要素:

t=tabulate(s); 
[C,I]=max(t(:,2)); 
val=x1(find(s==t(I,1),1, 'first')); 

這應該適用於您有一個不同的最大尺寸鏈的情況。如果您有多個鏈條具有最大長度,會發生什麼情況? (你仍然可以稍微修改我的代碼...)