Matlab:;分组平均值;

Matlab:;分组平均值;,matlab,statistics,Matlab,Statistics,假设我有向量: y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03]; c = [0 0 0 0 1 1 1 2 2 2 2 ]; 是否有一种矢量化的方法来获得“分组平均值”,即对于c的每个唯一值,y的平均值?(这是一个简化的例子;我有一些类似的东西,但向量大小是以千为单位的,有数百个c值) 我可以在for循环中完成它,只是想知道它是否可以矢量化。下面是我的for循环实现: function [

假设我有向量:

 y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
 c = [0 0    0    0    1 1    1    2 2    2    2   ];
是否有一种矢量化的方法来获得“分组平均值”,即对于
c
的每个唯一值,
y
的平均值?(这是一个简化的例子;我有一些类似的东西,但向量大小是以千为单位的,有数百个c值)

我可以在for循环中完成它,只是想知道它是否可以矢量化。下面是我的for循环实现:

function [my,mc] = groupmean(y,c)
my = [];
mc = [];
for ci = unique(c)'
    mc(end+1) = ci;
    my(end+1) = mean(y(c==ci));
end
简短答复:

>> y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
>> c = [0 0    0    0    1 1    1    2 2    2    2   ];
>> groupmeans = accumarray(c'+1,y',[],@mean)
groupmeans =
        1.015
         2.01
        3.015
要解释以上内容:
accumarray
有点神秘,但非常有用,值得了解(而且非常快)。第一个输入是一个向量(它们必须是列向量,这就是为什么将第二个输入向量的行分组为
c'
y'
)。元素必须是正整数(出于某种原因),这就是为什么我在
c'
中添加了1。最后一个输入是一个函数的句柄,该函数作为累加器应用于y中的每组值


希望这有意义!如果没有,
doc Accumaray
:)

酷!谢谢看起来我还可以使用从
unique
返回的索引作为accumarray的第一个参数(例如,如果我的唯一值不是连续整数)@JasonS:或使用stats Toolbox中的
grp2idx
,或使用文件交换中的consolidator。@Jonas:谢谢你的建议。不是针对你的咆哮:我讨厌Mathworks将有用的小函数放在自动点菜工具箱中的方式。我的公司买不起一堆工具箱的浮动许可证,这样我们就可以使用这种功能;许可机制是昂贵的,并且许可证只有在你作为一个整体退出该计划后才能发布。(结束咆哮)@JasonS:幸运的是,这些小功能通常可以相对容易地实现,而且像
woodchips
这样的好人倾向于为我们做这些事情,并将他们的代码放到文件交换中。