一个文件中的平均值基于另一个文件中的值

时间:2013-07-11 07:12:47

标签: matlab

我有一个问题,我希望贡献者可以帮我解决。我认为最好只提供一个有效的例子:

我有两个单元,它们都包含相同数量的矩阵(读取一系列数据文件后跟一些循环计算的结果)。每个矩阵都是一个十进制年份列,后跟一系列数据列。这是虚拟数据:

A = [ 186.356 1 2 3 4;186.364 2 3 4 5;186.372 3 4 5 6]
B = [ 187.356 1 2 3 4;187.364 2 3 4 5;187.372 3 4 5 6]
C = [ 188.356 1 2 3 4;188.364 2 3 4 5;188.372 3 4 5 6]
x = {A,B,C}
D = [ 186.3568 1 2 3 4; 186.3576 2 3 4 5; 186.3584 3 4 5 6; 186.3592 4 5 6 7; 186.36 5 6 7 8; 186.3608 6 7 8 9; 186.3616 7 8 9 10; 186.3624 8 9 10 11; 186.3632 9 10 11 12; 186.364 10 11 12 13; 186.3648 11 12 13 14; 186.3656 12 13 14 15]
E = [ 187.3568 1 2 3 4; 187.3576 2 3 4 5; 187.3584 3 4 5 6; 187.3592 4 5 6 7; 187.36 5 6 7 8; 187.3608 6 7 8 9; 187.3616 7 8 9 10; 187.3624 8 9 10 11; 187.3632 9 10 11 12; 187.364 10 11 12 13; 187.3648 11 12 13 14; 187.3656 12 13 14 15]
F = [ 188.3568 1 2 3 4; 188.3576 2 3 4 5; 188.3584 3 4 5 6; 188.3592 4 5 6 7; 188.36 5 6 7 8; 188.3608 6 7 8 9; 188.3616 7 8 9 10; 188.3624 8 9 10 11; 188.3632 9 10 11 12; 188.364 10 11 12 13; 188.3648 11 12 13 14; 188.3656 12 13 14 15]
y = {D,E,F}

我的目的是对x和y中包含的数据列求和。但是你可以看到y中数据的分辨率远高于x,因此我首先要根据x的时间步长对y中的数据进行平均。

作为一个例子,x和y之间匹配的第一个时间段对应于矩阵A中的第1行,但只对应于矩阵D中的前10行.A中第一行的总和为10:

sumA = sum(A(1,2:end),2)

并且D中前10行的平均值是

sumD = sum(mean(D(1:10,2:end)),2)

共计38个。

这是一个简单的例子;我在两个大单元格中有很多行数据。我怀疑我需要从单元格中提取数据,循环遍历数据,同时重写到与前两个单元格x和y相同尺寸的另一个单元格,但是不知道从哪里开始。任何帮助都会很棒。

修改

为了澄清我的问题,我意识到我在原来的问题上犯了一个错误。这无疑是造成混乱的原因。

以上所有内容都是正确的,但前D行的总和是:

sumD = sum(mean(D(1:10,2:end)),2)
sumD =

28
实际上应该将

添加到A:

中第二行的总和
sumA = sum(A(2,2:end),2)
sumA =

14

这是因为矩阵D中第1列的第1-10行中的所有值都大于矩阵A的第1行和第1列中的值,但是小于或等于矩阵A的第2行和第2列。如果在矩阵D中增加虚拟数据可能更容易:

D = [ 186.3568 1 2 3 4; 186.3576 2 3 4 5; 186.3584 3 4 5 6; 186.3592 4 5 6 7; 186.36 5 6 7 8; 186.3608 6 7 8 9; 186.3616 7 8 9 10; 186.3624 8 9 10 11; 186.3632 9 10 11 12; 186.364 10 11 12 13; 186.3648 11 12 13 14; 186.3656 12 13 14 15; 186.3664 13 14 15 16; 186.3672 14 15 16 17; 186.368 15 16 17 18; 186.3688 16 17 18 19; 186.3696 17 18 19 20; 186.3704 18 19 20 21; 186.3712 19 20 21 22; 186.372 20 21 22 23]

现在结果将是两个值向量。第一个值是28 + 14,即A(或sumA)中第二行之和与矩阵D(或sumD)中前10行数据的平均值之和的结果。第二个值是A中第三行的总和,比方说sumA2:

sumA2 = sum(A(3,2:end),2)
sumA2 =

18

和sumD2:

sumD2 = sum(mean(D(11:end,2:end)),2)
sumD2 =

68
sumA2+sumD2

ans =

86

我希望这个过程自动化,以便我可以遍历单元格中的每个矩阵。即如果我从带有dims的单元格x和y开始:

x = 

[300x5 double]    [300x5 double]    [300x5 double]
y = 

[2000x5 double]    [2000x5 double]    [2000x5 double]

我希望结果是

z = 

[300x1 double]    [300x1 double]    [300x1 double]

我不确定这是否会让事情更清楚,但让我们看看!

1 个答案:

答案 0 :(得分:2)

好吧,如果我能够正确地获得所有棘手的规范,这里是代码:

function z = foo(x, y)
  z = x;
  for i = 1:length(x)
    z{i} = sum(z{i}(:, 2:end), 2);  
    dmin = 0;
    for j = 1:size(x{i}, 1)
      dmax = x{i}(j, 1);
      t = y{i}(:, 1);
      mask = t > dmin & t <= dmax;
      if any(mask)
        z{i}(j) = z{i}(j) + sum(median(y{i}(mask, 2:end)), 2);
      end
      dmin = dmax;
    end
  end
end

对于问题中的给定xy,对于答案z我有z{1} == z{2} == z{3}

>> z{1}
ans =
10
42
70

如果我从“修改”部分替换D,我会按照您的声明获得z{1}(3) == 86

代码没什么特别之处。 dmindmax根据x矩阵的第一列值(即AB等)保留当前日期范围。需要if any(mask)语句来避免从空数组中获取中位数,从而导致NaN的向量,这会导致总和。