我有两个列向量。
第一个列向量有几千个数据点长,我需要从前四十个项目中取中位数,然后从下一个四十个项目中取中位数,以此类推。
第二个列向量包含一个组 ID(从 1 到 3)。
我的目标是最终得到一堆中位数计算,并按组对它们进行排序。我非常不确定如何在 MATLAB 中解决这个问题。
我有两个列向量。
第一个列向量有几千个数据点长,我需要从前四十个项目中取中位数,然后从下一个四十个项目中取中位数,以此类推。
第二个列向量包含一个组 ID(从 1 到 3)。
我的目标是最终得到一堆中位数计算,并按组对它们进行排序。我非常不确定如何在 MATLAB 中解决这个问题。
reshape
你的向量成一个 40xN 矩阵,然后median
用来取每一列的中位数。
这里有一些代码可以帮助您入门。
如果您将两个向量都放在一个命名变量中,并且列数可以被 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,所以它可能包含错误,但应该没问题。