Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB使用两种不同的索引查找矩阵中列的平均值_Matlab_Loops_Mean - Fatal编程技术网

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!