0

2 つの列ベクトルがあります。

最初の列ベクトルは数千のデータ ポイントの長さであり、最初の 40 項目から中央値を取得し、次の 40 項目から中央値を取得する必要があります。

2 番目の列ベクトルには、グループ ID (1 から 3) が含まれます。

私の目標は、一連の中央値計算をまとめて、グループ別にソートすることです。MATLABでこれを行う方法がよくわかりません。

4

3 に答える 3

3

reshapeベクトルを 40xN 行列に変換し、使用medianして各列の中央値を取得します。

于 2013-01-21T10:17:09.547 に答える
2

開始するためのコードを次に示します。

1 つの名前付き変数に両方のベクトルがあり、列数が正確に 40 で割り切れる場合は、次のようにします。

% column 1 = data, column 2 = groupID
test = rand(400,2);

% compute medians of data
medians = median( reshape(test(:,1), 40,[]) );

% make each entry correspond to the correct groupID
medians = repmat(medians, 40,1);
medians = medians(:);

データが正確に 40 で割り切れない場合は、単純なループを使用します。

N = 40;

test = rand(10*N+4,2);

n = 1;
medians = zeros( ceil(size(test,1)/N), 1 );
for ii = 1:numel(medians)
    if n+N-1 > size(test,1)
        medians(ii) = median(test(n:end,1));
    else
        medians(ii) = median(test(n:n+N-1,1));
    end
    n = n+N;
end

必要に応じて以前と同じように複製します。

groupID別の変数に がある場合、または に従ってこれらをソートする方法について、このコードを調整するgroupIDのは非常に簡単です。

于 2013-01-21T11:07:06.543 に答える
0

グループを取得するのはかなり簡単です。

groupIDvec = groupID(1:40:end);% A vector with group numbers

各グループの中央値を見つけるには、@Oli で説明されているように、reshape

medianmat = reshape(datavector,40,[]); 
medianvec = median(medianmat); 

次に、それらを並べ替えるだけです。

[groupIdvec,idx] = sort(groupIDvec)

groupIDvec は、各値がどのグループに属しているかを示します。

result = medianvec(idx);

手元に Matlab がないため、エラーが含まれている可能性がありますが、問題ないはずです。

于 2013-01-21T11:03:21.027 に答える