MATLAB使用两种不同的索引查找矩阵中列的平均值
我有一个MATLAB使用两种不同的索引查找矩阵中列的平均值,matlab,loops,mean,Matlab,Loops,Mean,我有一个22007x3矩阵,第3列有数据,第1列和第2列有两个单独的索引 例如 当第1列中的值与第2列中的值相同时,我需要找出第3列中的值的平均值,最后得出如下结果: ans = 1 3 4.6667 1 16 3.6667 2 4 2 2 11 2.3333 请记住,在我的数据中,第1列和第2列中的值出现的次数可能不同 我已经尝试过的两个选项是meshgrid/accumarray选项,使用两个不同的unique函数和一个3D阵
22007x3
矩阵,第3列有数据,第1列和第2列有两个单独的索引
例如
当第1列中的值与第2列中的值相同时,我需要找出第3列中的值的平均值,最后得出如下结果:
ans =
1 3 4.6667
1 16 3.6667
2 4 2
2 11 2.3333
请记住,在我的数据中,第1列和第2列中的值出现的次数可能不同
我已经尝试过的两个选项是meshgrid
/accumarray
选项,使用两个不同的unique
函数和一个3D阵列:
[U, ix, iu] = unique(x(:, 1));
[U2,ix2,iu2] = unique(x(:,2));
[c, r, j] = meshgrid((1:size(x(:, 1), 2)), iu, iu2);
totals = accumarray([r(:), c(:), j(:)], x(:), [], @nanmean);
这就给了我:
??? Maximum variable size allowed by the program is exceeded.
Error in ==> meshgrid at 60
xx = xx(ones(ny,1),:,ones(nz,1));
还有循环选项
for i=1:size(x,1)
if x(i,2)== x(i+1,2);
totals(i,:)=accumarray(x(:,1),x(:,3),[],@nanmean);
end
end
这显然是非常非常错误的,尤其是因为x(i+1,2)
位
我也在考虑根据第1列中的值出现的次数创建单独的矩阵,但这将是一个漫长而低效的过程,因此我不愿意走这条路。在前两列上使用一个
唯一(…,'rows')
,然后只累加第三列(总是只有在真正发生累积的情况下才进行累积的最佳方法,从而避免索引,即可以使用unX
重新附加的前两列):
使用
唯一(…,'rows')
对前两列进行分组,然后仅累加第三列(始终是仅在实际发生累加时累加的最佳方法,从而避免索引,即前两列,您可以使用unX
重新附加索引):
这是使用稀疏矩阵数学的理想机会
x = [ 1 2 5;
1 2 7;
2 4 6;
3 4 6;
1 4 8;
2 4 8;
1 1 10]; % for example
SM = sparse(x(:,1),x(:,2), x(:,3);
disp(SM)
结果:
(1,1) 10
(1,2) 12
(1,4) 8
(2,4) 14
(3,6) 7
(1,1) 1
(1,2) 2
(1,4) 1
(2,4) 2
(3,6) 1
如您所见,我们一次性完成了“将相同的指数累积到相同的容器中”。现在您需要知道您拥有多少元素:
NE = sparse(x(:,1), x(:,2), ones(size(x(:,1))));
disp(NE);
结果:
(1,1) 10
(1,2) 12
(1,4) 8
(2,4) 14
(3,6) 7
(1,1) 1
(1,2) 2
(1,4) 1
(2,4) 2
(3,6) 1
最后,将一个除以另一个以获得平均值(仅使用具有值的元素):
如果然后disp(matrixMean)
,则
(1,1) 10
(1,2) 6
(1,4) 8
(2,4) 7
(3,6) 7
如果您希望以不同的方式访问各个元素,那么在计算SM和NE之后,您可以执行以下操作
[i j n] = find(NE);
matrixMean = SM(i,j)./NE(i,j);
disp([i(:) j(:) nonzeros(matrixMean)]);
这是使用稀疏矩阵数学的理想机会
x = [ 1 2 5;
1 2 7;
2 4 6;
3 4 6;
1 4 8;
2 4 8;
1 1 10]; % for example
SM = sparse(x(:,1),x(:,2), x(:,3);
disp(SM)
结果:
(1,1) 10
(1,2) 12
(1,4) 8
(2,4) 14
(3,6) 7
(1,1) 1
(1,2) 2
(1,4) 1
(2,4) 2
(3,6) 1
如您所见,我们一次性完成了“将相同的指数累积到相同的容器中”。现在您需要知道您拥有多少元素:
NE = sparse(x(:,1), x(:,2), ones(size(x(:,1))));
disp(NE);
结果:
(1,1) 10
(1,2) 12
(1,4) 8
(2,4) 14
(3,6) 7
(1,1) 1
(1,2) 2
(1,4) 1
(2,4) 2
(3,6) 1
最后,将一个除以另一个以获得平均值(仅使用具有值的元素):
如果然后disp(matrixMean)
,则
(1,1) 10
(1,2) 6
(1,4) 8
(2,4) 7
(3,6) 7
如果您希望以不同的方式访问各个元素,那么在计算SM和NE之后,您可以执行以下操作
[i j n] = find(NE);
matrixMean = SM(i,j)./NE(i,j);
disp([i(:) j(:) nonzeros(matrixMean)]);
这应该与Eitan对你上一个问题的回答一致(即,当你想混合这两个问题时):就是这样!谢谢Oleg!这应该与Eitan对你上一个问题的回答一致(即,当你想混合这两个问题时):就是这样!谢谢Oleg!