3

Matlab の「データ」変数の繰り返し要素を組み合わせるのに問題があります。unique と sort を使用して値を簡単に組み合わせることができます。

[sorted,idx] = sort(data);
[~,ij] = unique(sorted,'first');
Indx = (sort(idx(ij)));

ただし、これを行うことで、繰り返されるすべての値を組み合わせています。私が本当にやりたいのは、繰り返し要素のグループだけを結合することです。たとえば、次のようにします。

data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;]

要素の重複グループを結合する:

data = [1;2;3;4;3;2;1;4;]

順序を維持しながら、繰り返し要素のグループを結合する必要があります。組み合わせのインデックスに基づいて別の変数のデータを平均化する必要があるため、インデックスを返すことも役立ちます。

例えば:

data  = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;]
data2 = [7;2;4;5;3;4;6;8;5;3;5;7;4;2;4;6;8;4;3;6;7;8;4;2;9;3;2;0;]

dataCombined = [1;     2;  3;    4;   3;  2;     1;     4;   ]
data2average = [4.33;  4;  6.33  4.2  5;  5.25;  5.25;  3.5; ]

誰でも提案できますか?


解決:

回答ありがとうございます。MZimmerman6 のソリューションは私にとってはうまくいきました。「data2」配列の値を平均化するために何をしたかを示したかったのです。

data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;];
data2 = [7;2;4;5;3;4;6;8;5;3;5;7;4;2;4;6;8;4;3;6;7;8;4;2;9;3;2;0;];
change = diff(data)~=0;
indices = [1,find(change)'+1];
compressed = data(indices)';


numberOfRepeatingGroups = size(indices);


for i=1:numberOfRepeatingGroups(1,2)


  if(i == 1)   

      dataToAverage = data2(indices(1,1):(indices(1,2)-1));

  elseif (i == numberOfRepeatingGroups(1,2))

       dataToAverage = data2(indices(1,i):end);

  else

       dataToAverage = data2(indices(1,i):(indices(1,(i+1))-1));

  end

       data2Averaged(1,i) = mean(dataToAverage(:));

end   


data2Averaged =

4.3333    4.0000    6.3333    4.2000    5.0000    5.2500    5.2500    3.5000
4

2 に答える 2

4

導関数を使用して、グループ化の変化を示すデータ配列の変動を見つけることができます。導関数が 0 でないところはどこでも、正または負の変化があります。これらの変更が発生する場所を見つけて、対応するインデックスを取得します。以下のようなもの。

data = [1;1;1;2;2;2;3;3;3;4;4;4;4;4;3;3;2;2;2;2;1;1;1;1;4;4;4;4;];
change = diff(data)~=0;
indices = [1,find(change)'+1];
compressed = data(indices)';

そして結果は

compressed =
     1     2     3     4     3     2     1     4

そしてもちろん、indices変数を必要なものに使用することもできます。

注: 3 行目では、技術的には配列の先頭が変更されるため、インデックス 1 を追加します。次に、導関数で find を使用しているため、find コマンドに 1 を追加します。したがって、返さchangeれる配列は元の配列よりも 1 短くなります。 .

于 2013-09-09T16:02:51.843 に答える
2

File Exchangerude()のランレングス エンコーディング/デコンディング ユーティリティをお勧めします。

% Run-length encode preserving order
[len,val] = rude(data);
len =
     3     3     3     5     2     4     4     4
val =
     1     2     3     4     3     2     1     4

ここで、平均を計算するには、まず各サブシーケンスに でラベルを付け直してからrude()accumarray()

% Decode and re-label each subsequence
subs = rude(len,1:numel(len))';

% Take average on each re-labelled subsequence
accumarray(subs,data2,[],@mean)
ans =
    4.3333
    4.0000
    6.3333
    4.2000
    5.0000
    5.2500
    5.2500
    3.5000
于 2013-09-09T16:31:19.387 に答える