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"

这为您提供了您想要的三个数组。我认为这是非常干净和高效的——没有循环,只有四行代码。

于 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];
[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 回答
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

这是我的代码,希望对您有所帮助...

   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

虽然我会推荐其中一种直方图方法,但这是我将如何循环执行的方法。与其他一些解决方案没有太大不同,但我相信它只是更好一点,所以无论如何我都会发布它。

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 回答