MATLAB查找并应用函数到重复索引的值

8ea*_*ast 1 matlab matrix mean

我有一个352x11矩阵,由第1列索引,有10个数据点.一些索引值重复出现.我想找到重复的指数并计算重复试验的平均数据点(如果可能,避免循环).

例如,

x =

   26   77.5700   17.9735   32.7200
   27   40.5887   16.6100   31.5800
   28   60.4734   18.5397   33.6200
   28   35.6484   27.2000   54.8000
   29   95.3448   19.0000   37.7300
   30   82.7273   30.4394   39.1400
Run Code Online (Sandbox Code Playgroud)

最终得到:

ans =

   26   77.5700   17.9735   32.7200
   27   40.5887   16.6100   31.5800
   28   48.0609   22.8699   44.2150
   29   95.3448   19.0000   37.7300
   30   82.7273   30.4394   39.1400
Run Code Online (Sandbox Code Playgroud)

我在想是否使用过

J = find(diff(x(:,1))==0);
Run Code Online (Sandbox Code Playgroud)

为了找到重复值的位置,我可以将函数应用到相应的位置x,但是我从哪里开始?

Eit*_*n T 6

将采用更通用的方法unique来查找唯一索引值:

[U, ix, iu] = unique(x(:, 1));
Run Code Online (Sandbox Code Playgroud)

然后accumarray:

[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
Run Code Online (Sandbox Code Playgroud)

说明

要处理的输入值实际上是第二个参数accumarray.

一个参数accumarray是矩阵,每一行是(累积)输出矩阵中的一组索引,它对应于作为第二个参数给出的向量中匹配行的值.

将输出视为单元阵列.第二个参数是输入值,第一个参数中的每一行告诉输出矩阵的哪个单元accumarray应该存储相应的输入值.当输出"单元阵列"完成时,将一个函数(mean在我们的例子中)应用于每个单元格.

这是一个较小矩阵的简短示例:

x = [27, 10, 8;
     28, 20, 10;
     28, 30, 50];
Run Code Online (Sandbox Code Playgroud)

我们通过以下方式找到唯一值:

[U, ix, iu] = unique(x(:, 1));
Run Code Online (Sandbox Code Playgroud)

Vector U存储唯一值,并iu指示与每行关联的值的哪个索引(请注意,在此解决方案中我们没有用ix).在我们的例子中,我们得到了:

U = 
    27
    28

iu =
    1
    2
    2
Run Code Online (Sandbox Code Playgroud)

现在我们申请accumarray:

[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
Run Code Online (Sandbox Code Playgroud)

花哨的技巧meshgrid[r(:), c(:)]产生一组指数:

[r(:), c(:)] =
     1     1
     2     1
     2     1
     1     2
     2     2
     2     2
     1     3
     2     3
     2     3
Run Code Online (Sandbox Code Playgroud)

这些是输入值的索引x(:),它是一个列向量等效于x:

x(:) =
    27
    28
    28
    10
    20
    30
     8
    10
    50
Run Code Online (Sandbox Code Playgroud)

积累的过程:

  • 第一个值27转到输出矩阵中的单元<1,1>.
  • 第二个值28转到输出矩阵中的单元格<2,1>.
  • 第三个值28到达输出矩阵中的单元<2,1>.

看看刚刚发生了什么?两个值28都累积在同一个单元格中(最终它们将被平均).这个过程继续:

  • 第四个值10转到输出矩阵中的单元<1,2>.

等等...

一旦所有值都存储在单元格中,该函数mean就应用于每个单元格,我们得到最终的输出矩阵:

y =
    27    10     8
    28    25    30
Run Code Online (Sandbox Code Playgroud)