1

minまたは値を検索するとmax、次のように見つかった値のインデックスを取得できます。

[val, index] = max(some_array_of_values);

値のインデックスを取得するにはmedian?

注:
はい、私は中央値が何であるかを知っており、中間の 2 つの値の平均になる場合があることも知っています。私が取得したいのは、中央値に最も近いか等しい値のインデックスです。
値の配列にソートされていない値が含まれています。この配列をソートできません。元の配列のインデックスが必要です。もちろん、そのコピーを並べ替えることができます。配列のサイズによる制限はありません - 比較的小さい (約 100 の値)

4

6 に答える 6

4

アイデアは、ベクトルをソートし、中間値を取ることです。偶数長のベクトルの場合、中央の 2 つの値の平均を計算します。

例:

%# 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
于 2011-08-08T12:57:03.897 に答える
3

中央値を含むセットの場合、find と median を使用できます。

 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

後者の解決策は、どちらの場合でも機能するはずです。存在しない中央値のインデックスは適切なインデックスではなく、それに応じて値を使用する必要があることに注意してください (それを使用して何をしたい場合でも)。

于 2011-08-08T11:40:29.330 に答える
3

この問題に対処する 1 つの方法は、中央値を減算して、結果のベクトルの絶対値の最小値を見つけることです。

[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));
于 2014-02-04T10:22:28.923 に答える
0

私が取得したいのは、中央値に最も近いか等しい値のインデックスです。値の配列にソートされていない値が含まれています。この配列をソートできません。

高速な選択アルゴリズムを探しています。遅いループが含まれるため、Matlab 自体にコードを記述しても、 (内部的に使用されると報告されている) sortand などの組み込みの Matlab 関数のパフォーマンスを超えることはほとんどありません。代わりに、これらのソリューションよりも効率的なものが本当に必要な場合は、コンパイルされた言語で独自のものを実装する必要があります。mediansort

nth_elementMathworks ファイル交換から、C++ 標準ライブラリ関数への mex インターフェイスがstd::nth_element含まれており、特別な目的のfast_median関数が含まれています。これは、開始するのに適した例かもしれません。配列のインデックスを追跡するには、これを変更する必要があります。

于 2011-08-08T14:39:58.977 に答える
0

OK、私は自分でいくつかの解決策を見つけました。

まず、ベクトルの値を並べ替えますD

S = sort(D)

次に、中央値以上の最初の要素を検索します

idS = find(S >= median(S),1)

これで、その要素の正確な値を取得し、元のベクトルでそれを見つけようとすることができます:

idMed = find(D == S(idS))
于 2011-08-08T11:52:52.397 に答える
-1

配列を並べ替えることができないため(おそらく配列が非常に大きいため)、質問が適切でないため(配列内の要素の数が奇数の場合はどうするか)、次のようにします。

ixMedian = function(v)

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

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

要素の数が奇数の場合、中央値を返します。偶数の要素の場合、中央値に最も近い4つの要素の1つを返します。要素が均一に分布していて、2Nある場合、確率1 / Nで、中央値に最も近い2つの要素の1つを返します。

于 2011-08-08T13:52:10.547 に答える