0

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

元胞数组 '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 elseif 循环会起作用吗?我不确定如何解决这个问题,特别是因为元胞数组的工作方式与矩阵略有不同。

4

2 回答 2

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 及以后的兼容性问题

该功能在 Matlab 2013a 中unique更改。对于该版本以后,将'legacy'标志添加到unique,即将行替换[~, ii, jj] = unique(dates_sort)

[~, ii, jj] = unique(dates_sort,'legacy')
于 2013-09-27T18:18:25.957 回答
0

听起来你想做:

for it = 1:size(CellArray,1)
   sum = sum + cellArray{it}(4) % or .NameOfColumn if it a cell containing struct
end

mean(sum)
于 2013-09-27T17:54:57.697 回答