我有一个单元格数组,其中一些条目有两个数据点。如果数据是在同一天收集的,我想平均两个数据点。
单元格数组'site'的第一列是日期。第四列是数据浓度。如果数据来自同一天,我想平均第四列。
例如,如果我的单元格数组如下所示:
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
我想将第四列(10.4和10.1)平均分成一行,并保留其他所有内容。
帮助? if ifif循环是否有效?我不确定如何处理这个问题,特别是因为单元格数组的工作方式与矩阵有点不同。
答案 0 :(得分:3)
您可以使用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以后的兼容性问题:
函数unique
在Matlab 2013a中有changed。对于该版本,请将'legacy'
标记添加到unique
,即将行[~, ii, jj] = unique(dates_sort)
替换为
[~, ii, jj] = unique(dates_sort,'legacy')
答案 1 :(得分:0)
听起来你想要这样做:
for it = 1:size(CellArray,1)
sum = sum + cellArray{it}(4) % or .NameOfColumn if it a cell containing struct
end
mean(sum)