我有一个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
结束了:
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
,但我从哪里开始?
您可以申请accumarray
的多个列如下所示
labels = x(:,1) - min(x(:, 1)) + 1;
labels = [repmat(labels(:),size(x,2),1), kron(1:size(x,2),ones(1,numel(labels))).'];
totals = accumarray(labels,x(:),[], @mean);
这是改编自Gnovice的代码。
为了得到它,为你的代码工作,你这时就需要删除所有的零在前面
totals(find(mean((totals == zeros(size(totals)))')), :) = [];
这导致所期望的
26.0000 77.5700 17.9735 32.7200
27.0000 40.5887 16.6100 31.5800
28.0000 48.0609 22.8699 44.2100
29.0000 95.3448 19.0000 37.7300
30.0000 82.7273 30.4394 39.1400
一个更普遍的方法是采用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));
矢量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
和[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获得累积在同一细胞(最终他们将被平均)。 这个过程一直持续:
等等...
一旦所有的值存储在电池中,函数mean
被应用在每一个细胞,我们得到最终的输出矩阵:
y =
27 10 8
28 25 30
您可能会发现accumarray
与@mean
有用:
假设第一列保持值1 .. k
一些k <= size(x,1)
可以使用计算输出的每一列
col = accumarray( x(:,1), x(:,2), [], @mean ); % second column
鉴于你输入
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];
你可以创造一个重复vgalues共享相同的指数指标阵列,采用的第三输出unique
。
%Get index of unique values (1 - N)
[~, ~, ix] = unique(x(:,1))
然后你可以使用这个数组来重建矩阵,重复值与您所选择的功能相结合。
%Use accumarry to rebuild the matrix one column at a time
result = [...
accumarray( ix, x(:,1), [], @max ) ... %Many functions works here, as all inputs are the same. E.G. @mean, @max, @min
accumarray( ix, x(:,2), [], @mean ) ... %Use mean to combine data, per problem statement.
accumarray( ix, x(:,3), [], @mean ) ...
accumarray( ix, x(:,4), [], @mean ) ...
]