MATLAB发现和应用功能重复的指标值MATLAB发现和应用功能重复的指标值(MATLAB find

2019-05-12 11:35发布

我有一个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 ,但我从哪里开始?

Answer 1:

您可以申请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


Answer 2:

一个更普遍的方法是采用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获得累积在同一细胞(最终他们将被平均)。 这个过程一直持续:

  • 第四值10出现在输出矩阵到小区<1,2>。

等等...

一旦所有的值存储在电池中,函数mean被应用在每一个细胞,我们得到最终的输出矩阵:

y =
    27    10     8
    28    25    30


Answer 3:

您可能会发现accumarray@mean有用:

假设第一列保持值1 .. k一些k <= size(x,1)可以使用计算输出的每一列

col = accumarray( x(:,1), x(:,2), [], @mean ); % second column


Answer 4:

鉴于你输入

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 ) ...
    ]


文章来源: MATLAB find and apply function to values of repeated indices