MATLAB Accumarray加权平均值

Imm*_*lxR 6 matlab average mean accumarray

因此,我目前正在使用'accumarray'来查找与匹配ID相对应的一系列数字的平均值.输入输入:

ID----Value
1     215
1     336
1     123
2     111
2     246
2     851
Run Code Online (Sandbox Code Playgroud)

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

ID----Value
1     224.66
2     402.66
Run Code Online (Sandbox Code Playgroud)

为此,我使用此代码:

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

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

ID----Value----Weight
1     215     12
1     336     17
1     123     11
2     111     6
2     246     20
2     851     18
Run Code Online (Sandbox Code Playgroud)

新代码必须求和(val(i)*weight(i))/ sum(weight)而不仅仅是标准均值.谢谢你的帮助.

cha*_*pjc 7

您可以使用该行索引为"丘壑"(第二个输入accumarray),并定义自己的函数,它在组数据加权平均:

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)
Run Code Online (Sandbox Code Playgroud)

示范

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');
Run Code Online (Sandbox Code Playgroud)

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

>> 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
Run Code Online (Sandbox Code Playgroud)

使用第一组手动检查:

ig = 1;
sum(data(Groups==ig,2).*data(Groups==ig,3))/sum(data(Groups==ig,3))
ans =
  241.1250
Run Code Online (Sandbox Code Playgroud)