我有一个问题,我希望贡献者可以帮助我解决。我认为最好只提供一个工作示例:

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

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 的前 10 行的总和:
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 中前 10 行数据的均值之和(或 sumD)。第二个值是 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

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

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

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

我希望结果是
z =

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

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

最佳答案

好吧,如果我设法正确地获得了您所有棘手的规范,那么代码如下:

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 的向量,从而弄乱总和。

关于matlab - 一个文件中的平均值基于另一个文件中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17587167/

10-11 23:08
查看更多