unique
您可以使用 和 的组合简洁地做到这一点diff
而无需循环accumarray
。
定义数据:
data = {'01/01/2011' '36-061-0069' '1' '10.4';
'01/01/2011' '36-061-0069' '2' '10.1';
'01/04/2011' '36-061-0069' '1' '7.9';
'01/05/2011' '36-061-0069' '1' '13'};
然后:
dates = datenum(data(:,1),2); % mm/dd/yyyy format. Change "2" for other formats
[dates_sort ind_sort] = sort(dates);
[~, ii, jj] = unique(dates_sort);
n = diff([0; ii]);
result = accumarray(jj,vertcat(str2double(data(ind_sort,4))))./n;
给出期望的结果:
result =
10.2500
7.9000
13.0000
如果需要,您可以使用data(ind_sort(ii),1)
.
代码解释:日期首先转换为数字并排序。然后提取唯一日期和重复日期。最后,将重复行中的数据相加并除以重复次数以获得平均值。
Matlab 2013a 及以后的兼容性问题:
该功能在 Matlab 2013a 中unique
已更改。对于该版本以后,将'legacy'
标志添加到unique
,即将行替换[~, ii, jj] = unique(dates_sort)
为
[~, ii, jj] = unique(dates_sort,'legacy')