MATLAB Accumarray 加权平均值

标签 matlab average mean accumarray

所以我目前正在使用“accumarray”来查找与匹配 ID 相对应的一系列数字的平均值。例如输入:

ID----Value
1     215
1     336
1     123
2     111
2     246
2     851

我当前的代码找到上述值的未加权平均值,使用 ID 作为“分隔符”,这样我就不会将所有值的平均值作为一个数字,而是仅将结果分开有相应的ID。 EX 输出:

ID----Value
1     224.66
2     402.66

为此,我使用以下代码:

[ID, ~, Groups] = unique(StarData2(:,1),'stable');
app = accumarray(Groups, StarData2(:,2), [], @mean);

将 StarData2 作为函数的输入。到目前为止,这对我的目的来说是完美的,我需要知道是否可以让 accumarray 给我一个加权平均值,这样应用程序中的每个点(在找到平均值之前)都可以分配一个权重,或者 @mean 可以替换为可以实现此目的的功能。新输入将如下所示:

ID----Value----Weight
1     215     12
1     336     17
1     123     11
2     111     6
2     246     20
2     851     18

新代码必须执行 sum(val(i)*weight(i))/sum(weight) 而不仅仅是标准平均值。感谢您的帮助。

最佳答案

您可以使用行索引作为“vals”(second inputaccumarray)并定义您自己的函数来对数据组进行加权平均:

Weights = data(:,3); Vals = data(:,2); % pick your columns here
WeightedMeanFcn = @(ii) sum(Vals(ii).*Weights(ii))/sum(Weights(ii));
wmeans = accumarray(Groups, 1:numel(Groups), [], WeightedMeanFcn)

示范

data(带有您的权重的新输入)和您的 unique 命令开始:

data = [1,215,12; 1,336,17; 1,123,11; 2,111,6; 2,246,20; 2,851,18];
[ID, ~, Groups] = unique(data(:,1),'stable');

accumarray 用法如下(重新定义WeightedMeanFcn每次你改变数据!):

>> Weights = data(:,3); Vals = data(:,2); % pick your columns here
>> WeightedMeanFcn = @(ii) sum(Vals(ii).*Weights(ii))/sum(Weights(ii));
>> app = accumarray(Groups, 1:numel(Groups), [], WeightedMeanFcn)
app =
  241.1250
  475.0909

手动检查,第一组:

ig = 1;
sum(data(Groups==ig,2).*data(Groups==ig,3))/sum(data(Groups==ig,3))
ans =
  241.1250

关于MATLAB Accumarray 加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22792020/

相关文章:

Excel 到 matlab 时间戳

java - 在ArrayList中查找最小值、最大值、平均值

c - 为什么我的代码在运行时输出 0?怎么了,我该如何解决?

r - R中的for循环计算列表的平均值

javascript - 使用 Angular 更改 url 的名称

MatLab AccumArray 意外改变顺序

matlab - (matlab)在任何地方实现 "Evaluate or Open Code You Select"?

Java Stream 平均值的最大值

python - 在列表中查找平均值,并在 Python 中返回结果分数超过平均值

arrays - 计算向量中小于另一个向量中每个元素的值