Octave .oct 関数をコンパイルして、[5,8,4,6,7] のような奇数の長さのベクトルなど、長さが異なる並べ替えられたベクトルの上半分と下半分の中央値を計算しようとしています。 4,5 と 6 の「低い」中央値と 6,7 と 8 の「高い」中央値 (6 は両方の計算の一部です) が必要で、[5,8,4 などの偶数の長さのベクトルが必要です。 ,6,7,9] 4,5 と 6 の「低い」中央値と 7,8 と 9 の「高い」中央値が必要です。また、これを行うために高速な方法を使用しようとしています。私が適応させたこのコードを使用して、単純な中央値計算に使用します:-
middle = input.length()/2 + 0.5; //middle for odd-length,"upper-middle" for even length
std::nth_element(&input(0),&input(middle),&input(input.length()) );
if (input.length() % 2 != 0) { // odd length
median = input(middle);
} else { // even length
// the "lower middle" is the max of the lower half
lower_middle = *std::max_element( &input(0), &input(input.length()/2) );
median = ( input(middle) + lower_middle ) / 2.0;
}
入力ベクトルを理論上の半分に「分割」できます
if ( input.length() % 2 != 0) { // input vector is odd length
middle = input.length()/2 + 0.5;
std::nth_element( &input(0), &input(middle), &input(input.length()) );
// *now find median of range &input(0) to &input(middle) incl.
// *and median &input(middle) to &input(input.length()) incl.
// *using fast method given above
} else { // input vector is even length
middle = input.length()/2; // uppermost value of the lower half of the input vector
std::nth_element( &input(0), &input(middle), &input(input.length()) );
// *now find median of range &input(0) to &input(middle) incl.
// *and median &input(middle + 1) to &input(input.length()) incl.
// *using fast method given above
}
私が抱えている問題は、上記の*コメントされた中央値計算を入力ベクトルの指定された関連部分だけに適用する構文がわからないことです。おそらく、入力は Octave ColumnVector 入力 = args(0).column_vector_value() であり、10 から 50 の値の長さになることに言及する必要があります。