我想为两个矩阵编写这样的代码:
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';
如何找出y中每组数字的平均值,x中的索引相同?
我的算法看起来像:
If x(1)=x(2) counter1=1 sum1=y(1)+y(2)
x(2)=x(3) counter1=2 sum1=sum+y(3) Define newx1=x(1) newy1=sum1/counter1
x(3)<>x(4)
x(4)=x(5) counter2=1 sum2=y(4)+y(3) Define newx2=x(4) newy2=sum2/counter2
x(5)<>x(6)
x(6)=x(7) counter3=1 sum3=y(6)+y(7)
x(7)=x(8) counter3=2 sum3=sum+y(8)
x(8)=x(9) counter3=3 sum3=sum+y(9) Define newx1=x(6) newy3=sum3/counter3
我的问题是在循环中使用两个以上的计数器。也许,我应该写一些类似的东西:
s=1:8
for k=1:9
if x(k)=x(k+s);
else
s=s+1;
end
end
哪个不起作用:( 我会很乐意提供任何帮助或建议!
答案 0 :(得分:1)
如果我理解正确,您需要在“x”中具有相同索引的每组数字的平均值。在那种情况下......
function FindAverages
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';
means = [];
indexes = unique(x);
for i=1:numel(indexes)
index = indexes(i);
indexInY = (x==index);
means(end+1) = mean(y(indexInY));
end
disp(means);
答案 1 :(得分:1)
一种解决方案是使用统计工具箱中提供的GRPSTATS功能。它可以按群组应用功能:
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';
grpstats(y,x,@mean)
替代选项(例如,如果您没有统计工具箱))是在FileExchange上使用GROUP2CELL提交。它将对应于特定类别的数字放入单元阵列中的单独单元格中。然后你可以应用很多功能,包括CELLFUN的意思:
cellfun(@mean,group2cell(y,x))
答案 2 :(得分:0)
如果我理解你的问题你可以简单地使用accumarray,它应该比循环更快。
%#Input
x=[1 1 1 2 2 3 3 3 3]';
y=[11 21 31 24 32 33 13 37 3]';
[newx, idx]=unique(x,'legacy');
newy=accumarray(x(:),y(:),[],@mean); %#groups every element of 'y' according to the index of 'x' and applies the function '@fun' to each group.
%#Output
newy =[21.0000 28.0000 21.5000];
newx=[1 2 3]; %#returns the index used for each group
idx=[3 5 9]; %#returns the index of the last observation for each group