我想找到"重要的"当我有一个动作时,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。
谢谢!
答案 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
我确信可以更有效地编码,但我现在不能想到如何更紧凑地编写它。 posloc
和negloc
是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)似乎在其他方面得到回答?