在MATLAB中获取中值的索引

时间:2011-08-08 11:28:56

标签: matlab indexing median

在搜索minmax值时,可以获得找到的值的索引:

[val, index] = max(some_array_of_values);

如何获取median值的索引?

注意:
是的,我知道中位数是多少,我知道它有时可以是中间两个值的平均值。我想得到的是最接近或等于中值的价值指数 值数组包含未排序的值。 我们无法对这个数组进行排序 - 我需要原始数组中的索引。但是我们当然可以对它进行排序。由于阵列的大小没有限制 - 它相对较小(约100个值)

6 个答案:

答案 0 :(得分:3)

对于包含中位数的集合,您可以使用查找和中位数。

 a = [1, 2, 3, 4, 5]
 find(a == median(a))

对于不包含中位数的集合,您需要变得聪明。我们首先发现最大的指数大于中位数,最大的指数小于中位数。当然,在这里,我假设该集合已经排序。它使一切变得更容易。

 b = [1, 2, 3, 4]
 (min(find(b>median(b))) + max(find(b<median(b)))) / 2

后两种解决方案应该适用于两种情况。观察到不存在的中位数的索引根本不是一个合适的索引,你应该相应地使用该值(无论你想做什么)。

答案 1 :(得分:3)

我们的想法是对矢量进行排序,并取中间值。对于偶数长度向量,我们计算中间两个值的平均值。

示例:

%# some random vector
%#x = rand(99,1);        %# odd-length
x = rand(100,1);         %# even-length

%# index/indices for median value
num = numel(x);
[~,ord] = sort(x);
idx = ord(floor(num/2)+(rem(num,2)==0):floor(num/2)+1);

%# median value
med = mean( x(idx) );

%# compare against MATLAB's function
median(x)

修改

以下是一个示例函数实现:

function [med idx] = mymedian(x)
    %# MYMEDIAN
    %#
    %# Input:   x        vector
    %# Output:  med      median value
    %# Output:  idx      corresponding index
    %#
    %# Note: If vector has even length, idx contains two indices
    %# (their average is the median value)
    %#
    %# Example:
    %#    x = rand(100,1);
    %#    [med idx] = mymedian(x)
    %#    median(x)
    %#
    %# Example:
    %#    x = rand(99,1);
    %#    [med idx] = mymedian(x)
    %#    median(x)
    %#
    %# See also: median
    %#

    assert(isvector(x));
    [~,ord] = sort(x);
    num = numel(x);

    if rem(num,2)==0
        %# even
        idx = ord(floor(num/2):floor(num/2)+1);
        med = mean( x(idx) );
    else
        %# odd
        idx = ord(floor(num/2)+1);
        med = x(idx);
    end
end

答案 2 :(得分:3)

解决此问题的一种方法是减去中位数并找到结果向量的绝对值的最小值:

[val, index] = min(abs(some_array_of_values - median(some_array_of_values)));

结果会得到最接近中位数的值。

这应该可以找到最接近value_of_interest的值的索引。

[val, index] = min(abs(some_array_of_values - value_of_interest));

答案 3 :(得分:0)

好的,我自己找到了一些解决方案。

首先,我对矢量D

中的值进行排序
S = sort(D)

然后我搜索大于或等于中位数

的第一个元素
idS = find(S >= median(S),1)

现在我可以获得该元素的确切值并尝试在原始向量中找到它:

idMed = find(D == S(idS))

答案 4 :(得分:0)

  

我想得到的是最接近或等于中位数的指数   值。值数组包含未排序的值。我们无法排序   这个数组。

您正在寻找快速selection algorithm。您很可能无法通过在Matlab本身编写代码来击败内置Matlab函数(如sortmedian(内部报告使用sort)的性能,因为这将涉及慢循环。相反,如果你真的需要比那些解决方案更有效的东西,你将不得不用编译语言实现自己的东西。

Mathworks文件交换中的

nth_element包含一个指向C ++标准库函数std::nth_element的mex接口,并包含一个特殊用途的fast_median函数 - 这可能是一个很好的例子,从。你必须修改它来跟踪数组指标。

答案 5 :(得分:-1)

由于数组无法排序,(可能是因为它太大了),并且因为问题不对(在数组中奇数个元素的情况下该怎么做),只需执行以下操作: / p>

ixMedian = function(v)

if (mod(numel(v),2) == 1)
   vtemp = v(1:end-1);
else
   vtemp = v;
end

ixMedian = find(vtemp == median(vtemp))

在奇数个元素的情况下,它返回中位数。在偶数个元素的情况下,它返回最接近中值的4个元素之一。如果元素均匀分布,并且如果它们有2N,则概率为1 / N,它返回最接近中位数的2个元素之一。