2016-02-27 79 views
1

我的節目的最大的4個值會產生以下輸出在一段時間enter image description here尋找當地的最大

,並在一段時間後

enter image description here

,我想確定的最大的4個值兩個冠。我設法找到最大峯值的最大4個值(參見下面的代碼),這是相對簡單的,因爲我基本上需要找到絕對最大值。但我不知道如何找到小冠的最大4個值,我想知道是否有人可以幫助我?


這裏是我用來尋找最大峯值最大4個值的C++代碼:

for(i=0;i<4;i=i+1) 
{ 
    queue_matrix[i] = 0.0; 
} 

for(i=0;i<SPACE;i=i+1) 
{ 
    if(U_field_matrix[i][t1] > queue_matrix[0]) 
    { 
     queue_matrix[0] = U_field_matrix[i][t1]; 
    } 
} 

for(i=0;i<SPACE;i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix[1]) && (U_field_matrix[i][t1] < queue_matrix[0])) 
    { 
     queue_matrix[1] = U_field_matrix[i][t1]; 
    } 
} 

for(i=0;i<SPACE;i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix[2]) && (U_field_matrix[i][t1] < queue_matrix[1])) 
    { 
     queue_matrix[2] = U_field_matrix[i][t1]; 
    } 
} 

for(i=0;i<SPACE;i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix[3]) && (U_field_matrix[i][t1] < queue_matrix[2])) 
    { 
     queue_matrix[3] = U_field_matrix[i][t1]; 
    } 
} 
+1

對於一個連續函數,局部最大值/最小值出現在導數零。離散版本將是最大值,其中從一個值到下一個值的變化從增加到減少。查看值之間的差異可能會有所幫助。如果沒有什麼變化(平坦部分)或者曲線不平滑,這會變得雜亂無章,但是您可以解決這個問題。 – e0k

+1

主要問題是決定什麼構成一個波峯。 「山」是一個頂峯(高度爲0.6,但寬度爲40)?什麼是波峯的最小高度?最大寬度?其實究竟是什麼寬度? – Dialecticus

+0

@ e0k您的評論非常有幫助,謝謝! – Hunter

回答

0

受@ e0k評論(謝謝!)的啓發,以下代碼將確定兩個頂點的最大4個值。

for(i=0;i<SPACE;i=i+1) 
{ 
    if((U_field_matrix[i][t1] > 0.1) && (U_field_matrix[i+1][t1]-U_field_matrix[i][t1] < 0.0)) 
    { 
     counter1 = i; 
     break; 
    } 
} 

for(i=0;i<4;i=i+1) 
{ 
    queue_matrix1[i] = 0.0; 
} 

for(i=(counter1-3);i<(counter1+4);i=i+1) 
{ 
    if(U_field_matrix[i][t1] > queue_matrix1[0]) 
    { 
     queue_matrix1[0] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter1-3);i<(counter1+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix1[1]) && (U_field_matrix[i][t1] < queue_matrix1[0])) 
    { 
     queue_matrix1[1] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter1-3);i<(counter1+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix1[2]) && (U_field_matrix[i][t1] < queue_matrix1[1])) 
    { 
     queue_matrix1[2] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter1-3);i<(counter1+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix1[3]) && (U_field_matrix[i][t1] < queue_matrix1[2])) 
    { 
     queue_matrix1[3] = U_field_matrix[i][t1]; 
    } 
} 

for(i=SPACE;i>-1;i=i-1) 
{ 
    if((U_field_matrix[i][t1] > 0.1) && (U_field_matrix[i-1][t1]-U_field_matrix[i][t1] < 0.0)) 
    { 
     counter2 = i; 
     break; 
    } 
} 

for(i=0;i<4;i=i+1) 
{ 
    queue_matrix2[i] = 0.0; 
} 

for(i=(counter2-3);i<(counter2+4);i=i+1) 
{ 
    if(U_field_matrix[i][t1] > queue_matrix2[0]) 
    { 
     queue_matrix2[0] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter2-3);i<(counter2+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix2[1]) && (U_field_matrix[i][t1] < queue_matrix2[0])) 
    { 
     queue_matrix2[1] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter2-3);i<(counter2+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix2[2]) && (U_field_matrix[i][t1] < queue_matrix2[1])) 
    { 
     queue_matrix2[2] = U_field_matrix[i][t1]; 
    } 
} 

for(i=(counter2-3);i<(counter2+4);i=i+1) 
{ 
    if((U_field_matrix[i][t1] > queue_matrix2[3]) && (U_field_matrix[i][t1] < queue_matrix2[2])) 
    { 
     queue_matrix2[3] = U_field_matrix[i][t1]; 
    } 
} 
0

在你應該找到波峯尋找值x axis = ix axis = i + 1值的每一個曲線圖。你會得到兩個冠,更大的價值是更大的冠。然後,將每個值與之前找到的一組值進行比較

1

我還在猶豫要發佈此,因爲你似乎有一個非常簡單的用例,其解決方案涵蓋了可能足夠好,但真的有更好的方法來尋找前k值。一般來說,如果你把它分解成一個查找最大值的函數(根據eOk的說法,如果這對你有效),可能會幫你一個忙,一個函數查找top-k和一個運行您的數據,並在周圍值發現最大值時調用top-k函數。

我現在沒有類似的解決方案,也不知道變量的類型,所以不可能爲你寫一個,但例如top-k對我來說通常是這樣的:

#include <algorithm> 
#include <vector> 
template <class in_iterator, class out_iterator,         
     class value_type = typename std::iterator_traits<in_iterator>::value_type, 
     class compare = std::greater<value_type>>        
void findTopK(in_iterator start, in_iterator end, out_iterator out,    
     size_t k)                
{                    
    std::vector<value_type> heap;            
    heap.reserve(k + 1);               
    for (;start != end; ++start)             
    {                   
     heap.push_back(*start); //min-oriented heap, order implied by compare 
     std::push_heap(std::begin(heap), std::end(heap), compare());    
     if (heap.size() > k)              
     {                  
      std::pop_heap(std::begin(heap), std::end(heap), compare());   
      heap.pop_back();              
     }                  
    }                   
    while (!heap.empty())              
    {                   
     std::pop_heap(std::begin(heap), std::end(heap), compare());    
     *out++ = heap.back();             
     heap.pop_back();               
    }                   
} 

該方法使用堆來跟蹤k個最大的元素。調用它的規則陣列上的作品,以及任何容器上,看起來像這樣:

int main()                  
{                    
    int array[] = {1,3,4,5,6,2,62,3,32};           
    std::vector<int> results;             
    findTopK(std::begin(array), std::end(array), back_inserter(results), 5); 
} 

正如你不必寫counterx循環每次k個結果,而你的代碼變得更具可讀性。你困難的部分,可以提供爲你的元素自定義比較功能,但有足夠的職位上會這樣:

Custom comparator for set

+0

謝謝你midor。Allthough我不會爲這個特殊情況實施這個解決方案,我相信在將來某個時候我需要更復雜的東西,所以你的答案仍然有用! +1 – Hunter