【问题标题】:Matlab: "grouping mean"Matlab:“分组均值”
【发布时间】:2012-06-04 17:44:58
【问题描述】:

假设我有向量:

 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   ];

有没有一种矢量化的方法来获得“分组均值”,即y 的每个唯一值c 的平均值? (这是一个简化的例子;我有类似的东西,但向量大小是数千个,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

【问题讨论】:

    标签: matlab statistics


    【解决方案1】:

    简答:

    >> 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'),它对第二个输入向量的行进行分组。元素必须是正整数(出于某种原因),这就是我将 1 添加到 c' 的原因。最后一个输入是函数的句柄,该函数作为累加器应用于 y 中的每组值。

    希望这是有道理的!如果没有,doc accumarray :)

    【讨论】:

    • 酷!谢谢!看起来我也可以使用从 unique 返回的索引作为 accumarray 的第一个参数(例如,如果我的唯一值不是连续整数)
    • @JasonS: 或使用统计工具箱中的grp2idx
    • 或使用文件交换中的合并器。
    • @Jonas:感谢您的建议。不是针对您的咆哮:我讨厌 Mathworks 将有用的小功能放入点菜工具箱的方式。我的公司买不起一堆工具箱的浮动许可证,只是为了我们可以使用那种功能;许可机制很昂贵,并且在您关闭整个程序之前不会发布许可证。 (结束咆哮)
    • @JasonS:幸运的是,这些小功能通常可以相对容易地实现,并且有像woodchips 这样的好人倾向于为我们做这些事情并将他们的代码放到文件交换中。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多