在Matlab中计算值及其组的最快方法
我有这样一个矩阵:在Matlab中计算值及其组的最快方法,matlab,matrix,Matlab,Matrix,我有这样一个矩阵: Group A 1 | 1 5 | 2 1 | 3 2 | 4 4 | 5 2 | 6 2 | 7 3 | 8 2 | 9 3 | 10 5 | 11 1 | 12 A Value 1 | 5 2 | 3.5 3 | 2 4 | 0 5 | 1 6 |
Group A
1 | 1
5 | 2
1 | 3
2 | 4
4 | 5
2 | 6
2 | 7
3 | 8
2 | 9
3 | 10
5 | 11
1 | 12
A Value
1 | 5
2 | 3.5
3 | 2
4 | 0
5 | 1
6 | 2.5
7 | 4
8 | 3
9 | 0
10 | 0
11 | 1.5
12 | 0
在此矩阵中,列是项目,组是列的组。我有另一个矩阵如下:
Group A
1 | 1
5 | 2
1 | 3
2 | 4
4 | 5
2 | 6
2 | 7
3 | 8
2 | 9
3 | 10
5 | 11
1 | 12
A Value
1 | 5
2 | 3.5
3 | 2
4 | 0
5 | 1
6 | 2.5
7 | 4
8 | 3
9 | 0
10 | 0
11 | 1.5
12 | 0
预期结果:
A Value
1 | 5
2 | 3.5
3 | 2
4 | 3.25
5 | 1
6 | 2.5
7 | 4
8 | 3
9 | 3.25
10 | 3
11 | 1.5
12 | 3.5
我从第一个矩阵中发现1,3和12有相同的群,然后为了计算12的值,我计算1和3的平均值
在第二个矩阵值列是A列的值,我想用同一组中其他项的平均值计算列中每个项的零值。
我用了这个:
for h=1:size(Matrix2,1)
group=find(Matrix1(:,1)==Matrix2(h,1));
group_items=find(Matrix1(:,2)==Matrix1(group,2));
f=ismember(Matrix2(:,1),Matrix1(group_items,1));
if Matrix2(h,2)==0
Matrix2(h,2)=sum(Matrix2(f,2))/size(nonzeros(f),1);
end
end
但是,当第二个矩阵较大时,这是非常缓慢的。
有更快的方法吗?这样更好吗
M1 = [1 1
5 2
1 3
2 4
4 5
2 6
2 7
3 8
2 9
3 10
5 11
1 12 ]
M2 = [1 5
2 3.5
3 2
4 0
5 1
6 2.5
7 4
8 3
9 0
10 0
11 1.5
12 0 ]
Z = find(M2(:,2)==0)'
m = zeros(size(Z));
for k = 1:size(Z,2)
r = Z(k);
val = M2(M1(:,1)==M1(r,1),2);
m(k) = mean(val(val~=0))
end
M_out = M2;
M_out(M2(:,2)==0,2) = m
谢谢,你能给我举个例子吗?样本的预期输出?你确定你的第二个矩阵是正确的吗?你不只是想从你的第一个矩阵中找出每组的平均值吗?例如,您在组
1
中有三个值,即1
、3
和12
,因此您的第二个矩阵中的1
不应该是(1+3+12)/3
?12的值的预期结果是:(5+2)/2请对您的问题进行解释,说明如何获得12的值。这还不清楚。谢谢,没有使用循环的解决方案吗?可能如果你重新构造了输入(对于初学者,我会使它们成为单列向量,为什么你只需要连续数字的列…),但是循环真的没有错,除非你的Matlab已经过时5年了。首先检查此循环解决方案是否提供了适当的加速。也许这已经足够了。也许这是一个更好的方法,但它仍然很慢。