更通用的方法将采用unique
查找唯一索引值:
[U, ix, iu] = unique(x(:, 1));
进而accumarray
:
[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
解释
要处理的输入值实际上是second的参数accumarray
.
The first的参数accumarray
是一个矩阵,每一行都是(累积的)输出矩阵中的一组索引,并且它对应于作为第二个参数给出的向量中匹配行的值。
将输出视为元胞数组。第二个参数是输入值,第一个参数中的每一行表示输出矩阵的哪个单元格accumarray
应该存储相应的输入值。当输出“元胞数组”完成时,函数(mean
在我们的例子中)应用于每个单元格。
Example
这是一个带有较小矩阵的简短示例:
x = [27, 10, 8;
28, 20, 10;
28, 30, 50];
我们通过以下方式找到独特的价值:
[U, ix, iu] = unique(x(:, 1));
Vector U
存储唯一值,并且iu
指示与每行关联的值的索引(请注意,在此解决方案中,我们没有使用ix
)。在我们的例子中,我们得到:
U =
27
28
iu =
1
2
2
现在我们申请accumarray
:
[c, r] = meshgrid(1:size(x, 2), iu);
y = accumarray([r(:), c(:)], x(:), [], @mean);
花哨的技巧meshgrid
and [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 进入输出矩阵中的单元格 。
- 第二个值 28 进入输出矩阵中的单元格 。
- 第三个值 28 进入输出矩阵中的单元格 。
看到刚刚发生了什么吗?两个值 28 都在同一个单元格中累积(最终它们将被平均)。该过程继续:
等等...
一旦所有值都存储在单元格中,该函数mean
应用于每个单元格,我们得到最终的输出矩阵:
y =
27 10 8
28 25 30