Arrays 求其他指标控制参数的平均值
在这个问题上我需要一些帮助 我在MATLAB中有一个矩阵:Arrays 求其他指标控制参数的平均值,arrays,matlab,matrix,average,Arrays,Matlab,Matrix,Average,在这个问题上我需要一些帮助 我在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列是一
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列是一些温度测量值
第二列是表示颜色的索引代码(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是对应于1.2的提取的T,其他条目为零
然后,我写了很长的代码来寻找平均值,最后我可以找到矩阵
仅对应于指数1.2:
B = [24
28.5
0
0
24
28.5
0
0
0
0]
但这只适用于一个索引,它为其他索引指定零。我可以为所有人做这件事
单独运行索引,然后添加B,但这将需要很长时间,因为我的真实
矩阵是8760乘5
我相信有一个较短的方法可以做到这一点
谢谢
关于试试这个:
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
?这可以通过以下方式实现,也许更简洁:
太神了谢谢你的帮助。顺便说一句,我怎样才能像这样学习编码和逻辑索引?我有一些Matlab的中等背景。你的代码省时省力。我写了很长的if和for循环,试图得到答案。谢谢。很抱歉我计算了17+24=30。你说得对。不客气:)除了经验之外,我想不出任何关于逻辑索引的具体学习材料(从技术上讲,这不是逻辑索引,但想法是一样的)。以这个为例,试着去理解发生了什么,然后下次你需要它的时候,它可能会派上用场:)如果你一点都不懂,我很乐意尝试解释。你不需要使用find。下面的结果应该是相同的:match=(A(:,2)=c)和(A(:,3)=t);B(匹配)=平均值(A(匹配,1));
[~, ~, 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