Matrix 计算以八度为单位的行组的列平均值

Matrix 计算以八度为单位的行组的列平均值,matrix,octave,mean,Matrix,Octave,Mean,我有一个矩阵,例如: 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的平均值 这是我的解决方案,它实现了我需要使用的八度循环

我有一个矩阵,例如:

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的平均值

这是我的解决方案,它实现了我需要使用的八度循环:

R = zeros(k, n);
for r = 1:k
    R(r, :) = mean(A((v == r), :), 1);
end
我想知道它是否可以矢量化。所以,我需要的是用一个向量化的解决方案来代替for循环,这将比迭代的更有效

以下是我的许多尝试中的一个,这些尝试无法以矢量化的方式解决问题:

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

<>你可以把它看作矩阵乘法问题。例如,对于您的示例,这对应于

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];
B = [0.5,0,0.5;0,1,0];

C = B*A
主要的问题是,从标记列表中高效地构造B。我的建议是使用==的隐式扩展


只要我们的数据是浮点数据,您就可以自己动手求和,然后使用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

只要我们的数据是浮点数据,您就可以自己动手求和,然后使用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

似乎Btmp可以更容易地构造:idx==1:k'。这里应用了自动广播操作,所以repmat是不必要的。@IhorDobrovolskyi,对,我一直忘了,这是现在的事情。您是否还记得是否有任何加速?我不认为有任何合理的加速,但它应该会节省一些内存。并且有更多可读性的代码也是使用自动广播的一个很好的理由,所以我总是喜欢这种方式。似乎Btmp可以更容易地构造:idx==1:k'。这里应用了自动广播操作,所以repmat是不必要的。@IhorDobrovolskyi,对,我一直忘了,这是现在的事情。您是否还记得是否有任何加速?我不认为有任何合理的加速,但它应该可以节省一些内存。而且,有更多可读性的代码也是使用自动广播的一个很好的理由,所以我总是喜欢这种方式。我不知道accumdim。这似乎就是我一直在寻找的功能。谢谢你指点。难道你不知道这比回答更有效吗?老实说,accumdim的解决方案可读性较差,所以我更喜欢它的唯一原因是效率。@IhorDobrovolskyi其他原因是1个内存使用量减少,2个工作在旧版本的倍频程中,我发现这在HPC中非常常见。此外,accumdim和Accummaray是accumdim的一个更复杂但更灵活的版本,是这类问题的典型答案,对我来说似乎非常可读。我想可读性是相对的,可能取决于你对这些功能和自动广播的使用程度。我不知道accumdim。这似乎就是我一直在寻找的功能。谢谢你指点。难道你不知道这比回答更有效吗?老实说,accumdim的解决方案可读性较差,所以我更喜欢它的唯一原因是效率。@IhorDobrovolskyi其他原因是1个内存使用量减少,2个工作在旧版本的倍频程中,我发现这在HPC中非常常见。此外,accumdim和Accummaray是accumdim的一个更复杂但更灵活的版本,是这类问题的典型答案,对我来说似乎非常可读。我想可读性是相对的,可能取决于你对这些功能和自动广播的使用程度。