2013-10-27 3 views
1

Я пытаюсь найти медиану векторов (х, у) точки, используя nth_elementСтранное поведение с станд :: nth_element

 cv::Point2f medOffset; 
     vector<float> tempOffsetsX = offsetsX; 
     int medLoc = tempOffsetsX.size()/2; 
     nth_element(tempOffsetsX.begin(), tempOffsetsX.begin()+medLoc, tempOffsetsX.end()); 
//  sort(tempOffsetsX.begin(), tempOffsetsX.end()); 
     medOffset.x = tempOffsetsX[medLoc]; 

     vector<float> tempOffsetsY = offsetsY; 
****** debug out line 1 ********* 
     nth_element(tempOffsetsY.begin(), tempOffsetsY.begin()+medLoc, tempOffsetsY.end()); 
//  sort(tempOffsetsY.begin(), tempOffsetsY.end()); 
     medOffset.y = tempOffsetsY[medLoc]; 
****** debug out line 2 ********* 

tempOffsetsX работает просто отлично, но, иногда, tempOffsetsY дает очень странное результаты после nth_element. Вот пример вывода в отмеченных отладки линий

tempOffsetsY1: 5.184135  -1.564125  3.751759    0.221855    -0.742348  1.737648 
tempOffsetsY2: -0.742348  -1.564125  -8885092352.000000  -8850636800.000000  0.000000  0.000000 

Результаты довольно повторяемым, пока я не перекомпилировать, в котором указывают специфика изменить общая проблема остается. Очевидно, что вектор каким-то образом искажается, но я не могу придумать, как это сделать.

Кроме того, если я использую sort вместо nth_element, он работает без проблем. Для отладки я попытался сделать вид, а затем nth_element, который работал отлично. Так что каким-то образом переупорядочение, которое происходит внутри nth_element, запутывается, но я не могу придумать, как это сделать.

Любые идеи, как это происходит?

Редактировать - Больше информации о моей среде. Я запускаю Arch Linux. Я просто сделал обновление системы. Я должен отметить, что этот же код работал без проблем перед обновлением, и это первый раз, когда я запускал его после обновления. Но это пробел в несколько дней, и я всегда не решаюсь указывать на системные библиотеки на то, что обычно является моей собственной проблемой.

[]$ uname -r                      
3.11.6-1-ARCH    

[]$ gcc -v                       
Using built-in specs.                         
COLLECT_GCC=gcc                          
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper           
Target: x86_64-unknown-linux-gnu                      
Configured with: /build/gcc/src/gcc-4.8.2/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-cloog-version-check --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --with-linker-hash-style=gnu --disable-install-libiberty --disable-multilib --disable-libssp --disable-werror --enable-checking=release                    
Thread model: posix                         
gcc version 4.8.2 (GCC) 

[]$ pacman -Qi glibc 
Name   : glibc 
Version  : 2.18-8 
.... 
+0

А вы положительный offsetsX и offsetsY являются одного размера? –

+0

Да, я проверил это, чтобы быть уверенным. Для здравомыслия я также попытался использовать отдельные переменные medLocX и medLocY без изменений – ryan0270

+0

Хорошо, какова ваша среда исполнения? Версии компилятора и т. Д. –

ответ

1

Вполне вероятно, что вы бежите в недавнюю ошибку в libstdC++, который сломал nth_element функции. Это с тех пор были исправлены, но некоторые Linux высвобождает поставляется со сломанной версии (например, Ubuntu 13,10)

патч и обсуждение ошибки можно найти на GCC трекере: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800

Смежные вопросы