我无法组合我的Matlab“数据”变量的重复元素。我可以使用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”数组中的值而做了些什么。
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;];
change = diff(data)~=0;
indices = [1,find(change)'+1];
compressed = data(indices)';
numberOfRepeatingGroups = size(indices);
for i=1:numberOfRepeatingGroups(1,2)
if(i == 1)
dataToAverage = data2(indices(1,1):(indices(1,2)-1));
elseif (i == numberOfRepeatingGroups(1,2))
dataToAverage = data2(indices(1,i):end);
else
dataToAverage = data2(indices(1,i):(indices(1,(i+1))-1));
end
data2Averaged(1,i) = mean(dataToAverage(:));
end
data2Averaged =
4.3333 4.0000 6.3333 4.2000 5.0000 5.2500 5.2500 3.5000
答案 0 :(得分:4)
您可以使用衍生工具查找数据阵列中的波动,这表明分组发生了变化。在导数不为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
当然,您也可以将indices
变量用于您需要的任何内容。
注意强>
在第三行,我们添加索引1,因为从技术上讲,数组的开始是一个更改,然后我们在find命令中添加1,因为我们在派生上使用了find,因此返回的change
数组将为1比原来短。
答案 1 :(得分:2)
我永远不会停止推荐File Exchange: rude()
中的这个游程编码/解除扩展实用程序。
% 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
现在,要计算均值,首先使用rude()
重新标记每个子序列,然后使用accumarray()
% 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