我在这个问题上需要一些帮助
我在MATLAB中有这个矩阵:
A = [ 25 1.2 1
28 1.2 2
17 2.6 1
18 2.6 2
23 1.2 1
29 1.2 2
19 15 1
22 15 2
24 2.6 1
26 2.6 2];
第一列是一些温度测量值
第二列是表示颜色的索引代码(1.2:红色,.....等)
第3栏是取样的时间。只有从1到2的小时
我希望矩阵由第二列控制,如下所示:
如果是1.2,程序将在第1小时找到所有温度的平均值
对应1.2
所以,这里(25 + 23)/ 2 = 24
并且还找到第2小时的所有温度的平均值,并且对应
至1.2,(28 + 29)/ 2 = 28.5
和这个平均值:
[24
28.5]
将在1小时和2小时取代所有温度值
对应1.2。
然后,它对索引2.6和15
做同样的事情因此,所需的输出将是:
B = [ 24
28.5
15.5
22
24
28.5
19
22
15.5
22]
我的问题在于使用循环。我一次只能在一个索引上做到这一点。
例如,
T=[];
index=1.2;
for i=1:length(A)
if A(i,2)==index
T=[T A(i,1)];
else
T=[T 0];
end
end
因此,T是提取的T,对应于1.2,其他条目为零
然后,我编写了长代码来查找平均值,最后我找到了矩阵
仅对应于索引1.2:
B = [24
28.5
0
0
24
28.5
0
0
0
0]
但这仅适用于一个索引,并为其他索引分配零。我可以为所有人做这个
单独运行中的指数,然后添加B,但这需要很长时间才能实现
矩阵是8760乘5。
我确信有更短的方法可以做到这一点。
由于
此致
答案 0 :(得分:2)
试试这个:
B = zeros(size(A, 1), 1);
C = unique(A(:, 2))';
T = [1 2];
for c = C,
for t = T,
I1 = find((A(:, 2) == c) & (A(:, 3) == t));
B(I1) = mean(A(I1, 1));
end
end
修改强>
我认为c = 2.6
和t = 1
的预期答案是错误的......不应该是(17 + 24)/2 = 20.5
吗?
答案 1 :(得分:0)
使用accumarray
:
[~, ~, ii] = unique(A(:,2)); %// indices corresponding to second col values
ind = [ii A(:,3)]; %// build 2D-indices for accumarray
averages = accumarray(ind, A(:,1), [], @mean); %// desired averages of first col
result = averages(sub2ind(max(ind), ind(:,1), ind(:,2))); %// repeat averages