3

私はこれをどのように表現するかわかりませんが、例:

x = [1 4 4 5 5 5];
y = [5 1 3 3 4 5];

それから出力したい

xs          = [1 4 5];
ys          = [5 2 4];
frequencies = [1 2 3]

(x =1で5の平均'y'はであり、x =4で(1+3)/2 = 2の平均'y'はであり、x =5での平均'y'はであるため(3+4+5)/3 = 4)。

私はこれを不器用な方法で計算できますが、おそらく良い解決策があります。

4

7 に答える 7

4

ヒストグラム関数histcを使用して、各カテゴリを取得できます。

x = [ 1 4 4 5 5 5];
y = [ 5 1 3 3 4 5];
xs = unique(x);
[frequencies xb] = histc(x, xs); % counts the number of each unique occurrence
ysp = sparse(1:numel(x), xb, y); % a sparse matrix is a good way to organize the numbers
ys = full(sum(ysp)./sum(ysp>0)); % each column in the matrix corresponds to a "index"

これにより、必要な 3 つの配列が得られます。これは非常にクリーンで効率的だと思います。ループはなく、コードはわずか 4 行です。

于 2013-03-18T15:34:08.183 に答える
3
x = [1 4 4 5 5 5];
y = [5 1 3 3 4 5];
xs = unique(x);
[frequencies,bin] = histc(x,xs);
ys = arrayfun(@(i) mean(y(bin==i)), 1:length(xs));
于 2013-03-18T15:27:55.970 に答える
2

@ioum の答えは私にとってはうまくいきましたが、ここに投稿されたもの以外のベクトルを入力として与えたときに最後の行に小さな間違いがありました。たとえば、各ベクトルの最後の要素を削除すると、答えは次のようになります。

ys = [5 2 3.5]

わずかに修正されたコードは次のとおりです。

x = [1 4 4 5 5 5];
y = [5 1 3 3 4 5];
xs = unique(x);
[frequencies,bin] = histc(x,xs);
ys = arrayfun(@(i) mean(y(bin==i)), 1:length(xs));

@ioum さんの投稿を編集しようとしましたが、編集がうまくいきませんでした。

于 2014-05-25T04:00:01.410 に答える
0
x = [1 4 4 5 5 5]';
y = [5 1 3 3 4 5]';

%これはおそらくもっと賢く行うことができます...

indexlong=accumarray(x,x,[],@mean)'
meanlong=accumarray(x,y,[],@mean)'
frequencieslong=accumarray(x,1)'

%ゼロを除外する

takethese=(indexlong>0);
xs=indexlong(takethese)
ys=meanlong(takethese)
frequencies=frequencieslong(takethese)
于 2013-03-18T15:28:42.853 に答える
0

ヒストグラムアプローチの1つをお勧めしますが、これがループでそれを行う方法です。他のいくつかのソリューションとそれほど違いはありませんが、少しだけ良いと思うので、とにかく投稿します。

xs = unique(x)
for t = 1:length(xs)
   idx = x == xs(t);
   ys(t) = mean(y(idx));
   frequencies(t) = sum(idx);
end
于 2013-03-20T13:12:04.803 に答える
0

これが私のコードです。お役に立てば幸いです...

   x=sort(x);
   ind=1;
    for i=1:length(x)
        if (i>1 && x(i)==x(i-1))
           continue;
        end
        xs(ind)=x(i);
        freq(ind)=sum((x==x(i)));
        ys(ind)=sum((x==x(i)).*y)/freq(ind);
        ind=ind+1;
    end
于 2013-03-18T23:26:01.123 に答える
0

このソリューションが十分にエレガントであると見なされるかどうかはわかりませんが、これはうまくいくはずです:

x = [1 4 4 5 5 5];
y = [5 1 3 3 4 5];
[xs,I,J] = unique(x);    %The value of the index vector I is not required here.
ys = zeros(size(xs));
frequencies = zeros(size(xs));
for i = 1:max(J)
    I = find(J==i);
    ys(i) = mean(y(I));
    frequencies(i) = length(I);
end
xs,ys,frequencies

出力は次のようになります。

xs =

     1     4     5


ys =

     5     2     4


frequencies =

     1     2     3

これが役立つことを願っています。

于 2013-03-18T15:16:27.723 に答える