2

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が、どこから始めればよいでしょうか?

4

4 に答える 4

6

より一般的なアプローチではunique、一意のインデックス値を見つけるために使用されます。

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

そしてaccumarray

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

説明

処理する入力値は、実際には の2 番目のパラメータですaccumarray

最初のパラメータaccumarrayは行列で、各行は (累積された) 出力行列の一連のインデックスであり、2 番目のパラメータとして指定されたベクトルの一致する行の値に対応します。

出力を cell 配列と考えてください。2 番目のパラメーターは入力値で、最初のパラメーターの各行は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> に移動します。
  • 2 番目の値 28 は、出力マトリックスのセル <2,1> に移動します。
  • 3 番目の値 28 は、出力マトリックスのセル <2,1> に移動します。

何が起こったのか分かりますか?両方の値 28 が同じセルに蓄積されます (最終的には平均化されます)。プロセスは次のように続きます。

  • 4 番目の値 10 は、出力マトリックスのセル <1,2> に移動します。

等々...

すべての値がセルに格納されると、関数meanが各セルに適用され、最終的な出力行列が得られます。

y =
    27    10     8
    28    25    30
于 2013-04-18T15:40:28.233 に答える
0

あなたは役に立つかもしれませaccumarray@mean

1 .. k最初の列にいくつかの値が保持されていると仮定すると、次k <= size(x,1)を使用して出力の各列を計算できます。

col = accumarray( x(:,1), x(:,2), [], @mean ); % second column
于 2013-04-18T15:31:43.513 に答える