MATLAB Cell Array - 如果另一列匹配,则平均两个值

时间:2013-09-27 17:40:36

标签: matlab average cell-array

我有一个单元格数组,其中一些条目有两个数据点。如果数据是在同一天收集的,我想平均两个数据点。

单元格数组'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循环是否有效?我不确定如何处理这个问题,特别是因为单元格数组的工作方式与矩阵有点不同。

2 个答案:

答案 0 :(得分:3)

您可以使用uniquediffaccumarray的组合,在没有循环的情况下简洁地完成。

定义数据:

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)