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

Matlab 一个文件中的平均值基于另一个文件中的值,matlab,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.3

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

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

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(或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
我希望这个过程是自动化的,这样我就可以通过单元格中的每个矩阵。i、 e.如果我从带有dims的单元格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
如果我从您的“编辑”部分中替换
D
,我将得到
z{1}(3)==86
,正如您所声称的那样


代码没有什么特别之处
dmin
dmax
根据
x
中矩阵第一列的值保持当前日期范围(即
a
B
等)。需要一个
如果有的话(掩码)
语句来避免从空数组中取中值,这会导致向量
NaN
,这会弄乱总和。

这个问题写得很好,但需要澄清一点:您是如何将
a
的第一行与
D
的前10行关联起来的?你在考虑某种程度的宽容吗?如果是,那是什么?嗨,Roney,澄清一下:选择D的前10行是基于第一列(一年的十进制日)中的值位于D的第一列(该数据集的等效十进制日)中的第一个和第二个值之间的事实。我希望这现在更有意义。对不起,你能用这些值来说明吗?此外,如果您将其编辑到问题中而不是对其进行注释,则会更好。您真的想平均
Y
中的数据吗?感觉插值是一种方法…我的意思是,在
Y
中插值所有数据,以满足
X
中的时间戳,并求和。如果您只处理分辨率的差异,那么插值将是一种方法。如果在
Y
中存在大量的噪声,而在
X
中没有,那么我同意平均值更好。那么,会是哪一个呢?:)嗨,Rody,在分辨率更高的数据中确实存在大量噪音,因此我的想法是平均值;这是我喜欢的方法。对于x的每一个值,我有110个y的值。。。
>> z{1}
ans =
10
42
70