寻找高和低单元阵列MATLAB中的低峰值点

时间:2016-09-27 11:51:56

标签: arrays 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)计算重大更改次数 - 例如,1次更改 - / + 3

4)描述变化-1变化-1,1变化-1,1变化+3

任何帮助都会受到赞赏,比如MATLAB noob。

谢谢!

2 个答案:

答案 0 :(得分:1)

1)找到负峰值与找到正峰值相同 - 您需要做的就是将序列乘以-1然后再次发现峰值

2)如果你只是想要差异,那么你可以减去正峰和负峰的矢量(如果你想要两个方向的差异,可能会偏移一个)。像pospeaks-negpeaks这样的东西可以做到一边。您需要确定正峰值或负峰值是否为第一个(使用findpeaks的loc返回值来确定),然后根据需要执行pospeaks(1:end-1)-negpeaks(2:end)或反之亦然。

[编辑]正如你的评论所指出的,上面假设pospeaks和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返回的位置。[/ edit]

对于(3)至(5),更容易记录样本之间的差异:changes=[YT{2:end}]-[YT{1:end-1}];

3)要计算更改,请计算相邻元素之间差异的非零数:sum(changes~=0)

4)您没有定义“重大变化”的含义,但测试几乎与3)sum(abs(changes)>=3)

相同

5)只是changes(changes~=0)

答案 1 :(得分:0)

我建议diff是一个命令,它可以为你的所有问题提供解决方案的基础(在将单元格转换为cell2mat的数组之前)。它输出沿阵列的相邻值之间的差异:

1)你必须定义一个什么样的峰值&#39;只是猜测:

 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)似乎在其他方面得到回答?