向量的上半部和下半部的中位数

时间:2010-07-08 14:37:04

标签: c++ octave median nth-element

我正在尝试编译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 input = args(0).column_vector_value(),并且长度在10到50之间。

1 个答案:

答案 0 :(得分:0)

如果input.length()返回int而不是写入

middle = input.length()/ 2.f + 0.5;

整数值总是在c

中使用整数数学