使用MATLAB从列向量中获取中位数

时间:2013-01-21 10:14:00

标签: matlab

我有两个列向量。

第一列向量是数千个数据点长,我需要从前四十个项目中取出中位数,然后从接下来的四十个中取出中位数,依此类推。

第二列向量包含组ID(从1到3)。

我的目标是最终得到一堆中位数计算并按组排序。我很不确定如何在MATLAB中解决这个问题。

3 个答案:

答案 0 :(得分:3)

reshape将您的矢量转换为40xN矩阵,然后使用median获取每列的中位数。

答案 1 :(得分:2)

这里有一些代码可以帮助您入门。

如果两个矢量都在一个命名变量中,并且列数可以被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对这些内容进行排序,则对此代码进行调整非常简单。

答案 2 :(得分:0)

获得小组非常简单:

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

使用reshape

,可以按@Oli描述的方式查找每个组的中位数
medianmat = reshape(datavector,40,[]); 
medianvec = median(medianmat); 

现在你只需要对它们进行排序:

[groupIdvec,idx] = sort(groupIDvec)

这是您的排序结果,其中groupIDvec指示每个值在哪个组中:

result = medianvec(idx);

我手头没有Matlab,所以它可能包含错误,但它应该没问题。