2 つの列ベクトルがあります。
最初の列ベクトルは数千のデータ ポイントの長さであり、最初の 40 項目から中央値を取得し、次の 40 項目から中央値を取得する必要があります。
2 番目の列ベクトルには、グループ ID (1 から 3) が含まれます。
私の目標は、一連の中央値計算をまとめて、グループ別にソートすることです。MATLABでこれを行う方法がよくわかりません。
2 つの列ベクトルがあります。
最初の列ベクトルは数千のデータ ポイントの長さであり、最初の 40 項目から中央値を取得し、次の 40 項目から中央値を取得する必要があります。
2 番目の列ベクトルには、グループ ID (1 から 3) が含まれます。
私の目標は、一連の中央値計算をまとめて、グループ別にソートすることです。MATLABでこれを行う方法がよくわかりません。
reshape
ベクトルを 40xN 行列に変換し、使用median
して各列の中央値を取得します。
開始するためのコードを次に示します。
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
のは非常に簡単です。
グループを取得するのはかなり簡単です。
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 がないため、エラーが含まれている可能性がありますが、問題ないはずです。