2011-12-14 2 views
3

私は2つのマトリックスのためにこのようなコードを書きたい:xのインデックスが同じyの各グループの数値の平均値を調べるには、どうすればよいですか?

x=[1 1 1 2 2 3 3 3 3]'; 
y=[11 21 31 24 32 33 13 37 3]'; 

どのように私はXで同じインデックスを持つyの数字の各グループの平均値を見つけることができますか?

私のアルゴリズムは次のように見ることができます:ここ

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 

私の問題は、ループ内の3つ以上のカウンタを使用しています。私は任意の助けのためにgreatfullであるか、または助言するだろう

動作しませんでした
s=1:8 
for k=1:9 
if x(k)=x(k+s); 
else 
s=s+1; 
end 
end 

:(

+4

これは意味をなさない。あなたがしようとしていることを明確にしてください。また、Matlabには高度に最適化された 'mean'関数があることは知っていますか? – PengOne

+0

@PengOneあなたの答えに感謝します。はい、私はmatlabの平均関数を知っていますが、私は何とか変更する可能性のある自分の関数を作成する必要があります。だから私がしたいのは、xから同じ行列とynew = [(11 + 21 + 31)/ 3(24 + 32)/ 2(33)のうちの1つだけを得る別の行列xnew = [1 2 3] + 13 + 37 + 3)/ 4]私はよく説明できますか? – user1018331

答えて

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

一つの解決策は、統計ツールボックスで利用可能な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(@mean,group2cell(y,x)) 
0

私が正しくあなたは、単にaccumarrayを使用することができ、あなたの質問を理解している場合、それはより速くループその後、働く必要があります。そして、あなたは、関数cellfunを意味を含む多くの機能を、適用することができます。

%#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 
関連する問題