2016-09-27 134 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)似乎在其它点被应答?