如何组合重复值组和重复值组并保持顺序?Matlab

如何组合重复值组和重复值组并保持顺序?Matlab,matlab,duplicates,duplicate-removal,Matlab,Duplicates,Duplicate Removal,我在组合Matlab“data”变量的重复元素时遇到问题。我可以使用unique和sort轻松组合这些值 [sorted,idx] = sort(data); [~,ij] = unique(sorted,'first'); Indx = (sort(idx(ij))); 然而,通过这样做,我结合了所有重复的值。我真正想做的是只合并重复元素的组。例如: data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;] 合并重复

我在组合Matlab“data”变量的重复元素时遇到问题。我可以使用unique和sort轻松组合这些值

[sorted,idx] = sort(data);
[~,ij] = unique(sorted,'first');
Indx = (sort(idx(ij)));
然而,通过这样做,我结合了所有重复的值。我真正想做的是只合并重复元素的组。例如:

data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;]
合并重复的图元组:

data = [1;2;3;4;3;2;1;4;]
我需要组合重复元素组,以保持顺序。返回索引也会很有帮助,因为我需要根据组合索引对另一个变量中的数据求平均值

例如:

data  = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;]
data2 = [7;2;4;5;3;4;6;8;5;3;5;7;4;2;4;6;8;4;3;6;7;8;4;2;9;3;2;0;]

dataCombined = [1;     2;  3;    4;   3;  2;     1;     4;   ]
data2average = [4.33;  4;  6.33  4.2  5;  5.25;  5.25;  3.5; ]
有人能提出建议吗


解决方案:

谢谢大家的回答。MZimmerman6的解决方案对我很有效。我想展示一下我是如何平均“data2”数组中的值的


您可以使用导数来查找数据数组中的波动,这表明分组发生了变化。在导数不为0的任何地方,都会发生变化,无论是正变化还是负变化。找出这些变化发生的位置,然后获取相应的索引。像下面这样

data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;];
change = diff(data)~=0;
indices = [1,find(change)'+1];
compressed = data(indices)';
结果将是

compressed =
     1     2     3     4     3     2     1     4
当然,您也可以根据需要使用
索引
变量

注意
在第三行,我们添加索引1,因为从技术上讲,数组的开头是一个更改,然后我们向find命令添加1,因为我们在导数上使用find,所以返回的
change
数组将比原始数组短1

我将永远不会停止向用户推荐这个运行长度编码/反编码实用程序

现在,要计算平均值,首先用
rude()
重新标记每个子序列,然后使用
accumarray()


这正是我需要的。我真的非常感谢你!使用导数是非常聪明的,如果没有你的帮助,我想我永远也不会明白这一点!没问题。这就是我们在这里的目的。只是一个简单的提示,不要做
numberOfRepeatingGroups(1,2)
,只要做
size(index,2)
,就可以得到数组中的列数。或者,由于
索引
数组是一维的,您可以简单地使用
长度(索引)
。这也是一个很好的解决方案,但我几乎总是建议那些初学者使用他们自己编写的代码。当然,他们并没有编写diff函数,但我们知道它在引擎盖下做什么。不管怎样,我还是给你一个+1:)
compressed =
     1     2     3     4     3     2     1     4
% Run-length encode preserving order
[len,val] = rude(data);
len =
     3     3     3     5     2     4     4     4
val =
     1     2     3     4     3     2     1     4
% Decode and re-label each subsequence
subs = rude(len,1:numel(len))';

% Take average on each re-labelled subsequence
accumarray(subs,data2,[],@mean)
ans =
    4.3333
    4.0000
    6.3333
    4.2000
    5.0000
    5.2500
    5.2500
    3.5000