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,但是我从哪里开始?
将采用更通用的方法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)
积累的过程:
看看刚刚发生了什么?两个值28都累积在同一个单元格中(最终它们将被平均).这个过程继续:
等等...
一旦所有值都存储在单元格中,该函数mean就应用于每个单元格,我们得到最终的输出矩阵:
y =
27 10 8
28 25 30
Run Code Online (Sandbox Code Playgroud)