2016-09-27 86 views
0

我想要在MATLAB中查找單元格陣列中「有效」的變化,以便進行運動。查找單元格陣列中的高峯和低峯點MATLAB

E.g.我有YT,代表人臉交互的偏航演示中的動作。 YT可以根據從80x1到400x1之間的任何地方的互動來改變。前幾行可能是

YT = {-7 -8 -8 -8 -8 -9 -9 -9 -6 ...} 

我想記錄下

在整個單元陣列;

1)計數我可以findpeak而不是低峯做到這一點的高峯和低峯

數*

2)測量每個峯之間的區別 -

對於這個例子,峯值-9和-6之間的差值爲+3。所以報告1 + 3的峯值變化。目前我只對+/- 3的變化感興趣,但這可能會改變,所以我需要一個門檻?

,然後用細胞(重複對於在單元陣列)的X數目

3)的變化的計數數 - 在這個例子中,3改變

3)的顯著變化計數數 -/+ 3

4)描述的變化 - - -1 1種變化,-1 1種變化,的3

1個變化對於該示例,1個變化

任何幫助將不勝感激,一點點的MATLAB noob。

謝謝!

回答

1

1)尋找負峯是一樣的尋找積極的 - 所有你需要做的就是乘以-1序列,然後再

2)如果你只是想的不同,那麼你可以減去findpeaks正峯值和負峯值的矢量(如果你想在兩個方向上有差異,可能會偏移一個)。像pospeaks-negpeaks這樣的東西會做一方面的。您需要確定正峯值還是負峯值是否在第一位(使用findpeaks的loc返回來確定),然後根據需要執行pospeaks(1:end-1)-negpeaks(2:end)或反之。

正如您在評論中指出的那樣,上述假設posphaks和negpeaks是相同的長度。我不該這麼懶的!該代碼可以被更好地寫成:

if (length(pospeaks)>length(negpeaks)) 
    % Starts and ends with a positive peak 
    neg_diffs=pospeaks(1:end-1)-negpeaks; 
    pos_diffs=negpeaks-pospeaks(2:end); 
elseif (length(pospeaks)<length(negpeaks)) 
    % Starts and ends with a negative peak 
    pos_diffs=negpeaks(1:end-1)-pospeaks; 
    neg_diffs=pospeaks-negpeaks(1:end-1); 
elseif posloc<negloc 
    % Starts with a positive peak, and ends with a negative one 
    neg_diffs=pospeaks-negpeaks; 
    pos_diffs=pospeaks(2:end)-negpeaks(1:end-1); 
else 
    % Starts with a negative peak, and ends with a positive one 
    pos_diffs=negpeaks-pospeaks; 
    neg_diffs=negpeaks(2:end)-pospeaks(1:end-1); 
end 

我敢肯定,可以更有效地編碼,但剛纔怎麼把它更緊湊寫我想不出。 poslocnegloc是findpeaks的位置返回。[/編輯]

對於(3)至(5)更容易記錄的差異的樣品間:changes=[YT{2:end}]-[YT{1:end-1}];

3)向計數的變化,計算在相鄰元件之間的差異的非零的數目:sum(changes~=0)

4)你不定義你所說的 「顯著變化」 的意思,但測試幾乎是相同的3)sum(abs(changes)>=3)

5)它只是changes(changes~=0)

+0

嗨戴夫,這真的很有用。然而,我不能讓pospeaks [1:end-1] -negpeaks [2:end]跑步。有任何想法嗎?我將[]更改爲(),我得到一個矩陣尺寸錯誤(pospeaks是9x1,negpeaks是10x1) –

+0

對不起,方括號 - 我一直在寫MEX文件,所以我的C語言和Matlab語法混合起來!我必須承認,我愚蠢地認爲你會有像負峯一樣多的積極因素,但顯然生活從未如此簡單!您會在上面的解決方案中看到,我已經進行了大量編輯(由[編輯]和[/編輯]分隔),這提供了更強大的解決方案。我相信它可以寫得更優雅,但目前我無法想象如何!我希望它有幫助。 – Dave

+0

非常感謝戴夫! –

0

我建議diff是可以爲您的所有問題提供解決方案的基礎(先將單元格轉換爲具有cell2mat的數組)。它輸出相鄰值之間的差值沿陣列:

1)你必須定義什麼是「峯」,但在一個猜測:

YT = cell2mat(YT); % convert cell to array 
change = diff(YT); % get diffs 
highp = sum(change >= 3); % high peak threshold 
lowp = sum(change <= -3); % low peak threshold 

2)diff(cell2mat(YT))提供此。

3)

YT = cell2mat(YT); % convert cell to array 
change = diff(YT); % get diffs 
count = sum(change~=0); 

4)似乎在其它點被應答?