我有一个问题,我希望贡献者可以帮我解决。我认为最好只提供一个有效的例子:
我有两个单元,它们都包含相同数量的矩阵(读取一系列数据文件后跟一些循环计算的结果)。每个矩阵都是一个十进制年份列,后跟一系列数据列。这是虚拟数据:
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]
我不确定这是否会让事情更清楚,但让我们看看!
答案 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
对于问题中的给定x
和y
,对于答案z
我有z{1} == z{2} == z{3}
和
>> z{1}
ans =
10
42
70
如果我从“修改”部分替换D
,我会按照您的声明获得z{1}(3) == 86
。
代码没什么特别之处。 dmin
和dmax
根据x
矩阵的第一列值(即A
,B
等)保留当前日期范围。需要if any(mask)
语句来避免从空数组中获取中位数,从而导致NaN
的向量,这会导致总和。