gpt4 book ai didi

MATLAB 查找函数并将其应用于重复索引的值

转载 作者:行者123 更新时间:2023-12-05 08:44:06 29 4
gpt4 key购买 nike

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

例如,

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

最后:

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

我在想如果我用

J = find(diff(x(:,1))==0);

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

最佳答案

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

[U, ix, iu] = unique(x(:, 1));

然后是accumarray:

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

说明

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

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

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

例子

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

x = [27, 10, 8;
28, 20, 10;
28, 30, 50];

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

[U, ix, iu] = unique(x(:, 1));

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

U = 
27
28

iu =
1
2
2

现在我们应用accumarray:

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

meshgrid[r(:), c(:)] 的奇特技巧产生一组索引:

[r(:), c(:)] =
1 1
2 1
2 1
1 2
2 2
2 2
1 3
2 3
2 3

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

x(:) =
27
28
28
10
20
30
8
10
50

积累的过程:

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

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

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

等等……

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

y =
27 10 8
28 25 30

关于MATLAB 查找函数并将其应用于重复索引的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16086874/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com