繁体   English   中英

计算 Octave 中行组的列的平均值

[英]Compute mean of columns for groups of rows in Octave

我有一个矩阵,例如:

1 2
3 4
4 5

而且我还有一个对行进行分组的规则,它被定义为一个组 ID 的向量,如下所示:

1
2
1

这意味着第一行和第三行属于同一组(ID 1),第二行属于另一个组(ID 2)。 所以,我想计算每个组的平均值。 这是我的示例的结果:

2.5 3.5
3 4

更正式地说,有一个大小为 ( m , n ) 的矩阵A 、多个组k和一个大小为 ( m , 1) 的向量v ,其值是从 1 到k范围内的整数。 结果是大小为 ( k , n ) 的矩阵R ,其中索引为r的每一行对应于组r的平均值。

这是我在 Octave 中使用 for-loop 的解决方案(可以满足我的需要):

R = zeros(k, n);
for r = 1:k
    R(r, :) = mean(A((v == r), :), 1);
end

我想知道它是否可以矢量化。 因此,我需要用矢量化解决方案替换 for 循环,这将比迭代解决方案更有效。

这是我以矢量化方式解决问题的众多尝试之一(不起作用):

R = mean(A((v == 1:k), :);

只要我们的数据是浮点数,您就可以自己手动进行求和,然后使用accumdim进行除法。 像这样:

octave:1> A = [1 2; 3 4; 4 5];
octave:2> subs = [1; 2; 1];
octave:3> accumdim (subs, A) ./ accumdim (subs, ones (rows (subs), 1))
ans =

   2.5000   3.5000
   3.0000   4.0000

您可以将其视为矩阵乘法问题。 例如,对于您的示例,这对应于

A = [1 2; 3 4; 4 5];
B = [0.5,0,0.5;0,1,0];

C = B*A

主要问题是以有效的方式从您的指标列表中构建B 我的建议是使用==的隐式扩展。

A = [1 2; 3 4; 4 5]; % Input data
idx = [1;2;1]; % Input Grouping

k = 2; % number of groups, ( = max(idx) )
m = 3; % Number of "observations"
Btmp = (idx == 1:k)'; % Mark locations
B = Btmp ./sum(Btmp,2); % Normalise
C = B*A

C =

    2.5000    3.5000
    3.0000    4.0000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM