2012-01-24 5 views
6

के साथ मैं वीडियो विश्लेषण कर रहा हूं।एक सरणी के केवल न्यूनतम और अधिकतम चोटियों को निकालने और साजिश करने के लिए, -ग्राफ विश्लेषण- मैटलैब या एक्सेल

signal = 

    Columns 1 through 7 

     73960  73960  73960  73960  68102  68102  68102 

    Columns 8 through 14 

     68102  19187  19187  19187  19187  14664  14664 

    Columns 15 through 21 

     14664  14664  13715  13715  13715  13715  30832 

    Columns 22 through 28 

     30832  30832  30832  53031  53031  53031  53031 

    Columns 29 through 35 

     56897  56897  56897  16104  16104  16104  16104 

    Columns 36 through 42 

     15188  15188  15188  15188  13973  13973  13973 

नोट::
अंतिम परिणाम सरणी मैं की तरह कुछ है वास्तविक सरणी मैं आमतौर पर 600

तो जब मैं इस साजिश मैं बहुत बुरा दिखने ग्राफ मिलता है, इसलिए मैं फ़िल्टर करना चाहते हैं यह सरणी और केवल ** अधिकतम अधिकतम और न्यूनतम चोट ** स्थानीय अधिकतम और न्यूनतम रखें ताकि ग्राफ में अच्छी लहरें हों

क्या मैटलैब के साथ मैं ऐसा कर सकता हूं?

यदि नहीं तो मैं एक्सेल के साथ ऐसा कर सकता हूं? मैं आमतौर पर इस सरणी को बचाने के रूप में इस

0.1 68102 
0.15 19187 
0.2 14664 
0.25 13715 
0.3 30832 
0.35 53031 
0.4 56897 
0.45 16104 
0.5 15188 
0.55 13973 
0.6 21437 
0.65 66950 
0.7 65356 
0.75 22562 
0.8 14154 
0.85 13938 
0.9 20692 
0.95 72823 
1 69975 
1.05 15328 
1.1 14494 
1.15 13681 
1.2 14205 
1.25 65278 
1.3 63055 
1.35 16999 
1.4 14050 
1.45 14245 

जिसमें 1 स्तंभ समय (y- अक्ष) और 2 स्तंभ है जैसा चादर उत्कृष्टता प्राप्त करने आयाम। (X- अक्ष)

मैं का उपयोग इस सूत्र स्थानीय मॅक्सिमा गिनती करने के लिए

=SUMPRODUCT(--(B2:B149>B1:B148),--(B2:B149>B3:B150)) 

और यह सूत्र (brettdj से stackoverflow.com के लिए धन्यवाद) स्थानीय न्यूनतम गिनती करने के लिए

=SUMPRODUCT(--(B2:B149<B1:B148),--(B2:B149<B3:B150)) 

लेकिन मुझे केवल स्थानीय अधिकतममा और स्थानीय मिनीमा रखने के लिए सरणी को फ़िल्टर करना है, इसलिए मुझे शोर के बिना अच्छी तरह से खींचा वक्र मिल सकता है।

उत्तर

1

यदि आप चाहते हैं अधिकतम और न्यूनतम मूल्यों बस का उपयोग करें:

[sig_min, idx_min] = min(signal); 
[sig_max, idx_max] = max(signal); 

लेकिन मैं समझता हूँ कि आप क्या चाहते हैं ... के बाद से मेरे खाते नया है, मैं नहीं कर सकते आपके प्रश्न पर यह बेहतर समझने की कोशिश करने के लिए टिप्पणी सके।

- संपादित करें 1:

ठीक है, अब मैं समझता हूँ कि आप क्या चाहते हैं।मुझे नहीं पता कि आपके पास दोहराव संख्याओं के साथ यह सरणी क्यों है, लेकिन आपको लगता है कि आप उन्हें नहीं चाहते हैं, या कम से कम, स्थानीय अधिकतम और न्यूनतम खोजने के लिए उन्हें निकालना बेहतर है, आपको यह करना चाहिए:

sinal_norep = signal(find(diff(sinal))); 
, ऐसा करके

On the left is your signal, on the right the new one

अब हम सूचकांक जहां इस सरणी पर स्थानीय मॅक्सिमा और न्यूनतम होता है के लिए खोज कर सकते हैं::

जहां signal_norep अपने नए केवल मूल्यों है कि पिछले एक से अलग है जिसमें सरणी हो जाएगा

minimas_idx = find(signal_norep(2:end-1)<signal_norep(1:end-2) & signal_norep(2:end-1)<signal_norep(3:end))+1; 
maximas_idx = find(signal_norep(2:end-1)>signal_norep(1:end-2) & signal_norep(2:end-1)>signal_norep(3:end))+1; 

और उनके मूल्यों:

signal_maximas = signal_norep(maximas_idx); 
signal_minimas = signal_norep(minimas_idx); 

Thats यह x)

+0

मुझे सरणी में न्यूनतम और अधिकतम मान नहीं चाहिए, मैं स्थानीय मिनीमा और अधिकतमता (वक्र की चोटी) वक्र की चोटी चाहता हूं जब आप इसे ग्राफ पर साजिश करते हैं तो मेरा मतलब है – Zalaboza

+0

शिखर को परिभाषित किया गया है कि यह पहले मूल्य से अधिक है और बाद में (द) – Zalaboza

1

मैं इसे प्राप्त करने के लिए मैटलैब में सरणी पर एक साधारण लूप लिखूंगा। मुझे वहां कोई मौलिक समस्या नहीं दिख रही है?

यदि आप मैटलैब में लूप नहीं चाहते हैं, तो आप इसे कुछ सरणी संचालन के साथ कर सकते हैं। यदि आपके पास दो बराबर लंबे सरणी ए और बी हैं, तो आप c = a> b जैसे कुछ कर सकते हैं, जो आपको एक और शून्य के साथ एक सूची देता है। आप 1 अधिकतम/न्यूनतममा चुनने के लिए इसे ऑनलाइनर के रूप में उपयोग कर सकते हैं। ज़ो मान लीजिए कि आपके पास एक अपरिवर्तित और डाउनशिफ्टेड सरणी बी है, सी। ऐसा है कि (अंत बिंदुओं को छोड़कर) बी (एन -1) = ए (एन) = सी (एन + 1)। आप q=a.*((a>b).*(a>c) + (a<b).*(a<c))

द्वारा केवल एक्स्ट्रेमा और शून्य युक्त सरणी प्राप्त कर सकते हैं एक सलाह: यदि आपको सिग्नल होता है, तो यह चयन शोर होगा। फ़ंक्शन को सुगम बनाने के लिए, आपको किसी तरह के कर्नेल के साथ किसी प्रकार की मूविंग औसत लागू करना चाहिए।

+1

मुझे नहीं सरणी में न्यूनतम और अधिकतम मूल्य चाहते हैं, मैं स्थानीय न्यूनतम और मॅक्सिमा (वक्र के शिखर) चाहते वक्र के शिखर जब आप एक ग्राफ मेरा मतलब पर यह साजिश – Zalaboza

+0

तो, आप आसानी से लूप द्वारा उन्हें पहचान सकते हैं? इसके अलावा 3 एरे, एक अपरिवर्तित (बी), एक डाउनशिफ्ट (सी), आपके पास मैटलैब में स्थानीय चोटियों का प्रदर्शन होता है। * (ए> बी)। * (ए> सी)। तो आपको हर जगह एक्स्ट्रेमा और शून्य मिल जाएगा। – Bernhard

3

यह VBA

  • एक प्रकार विन्यास में, स्तंभ ए और बी से डेटा पढ़ता है
  • स्थानीय न्यूनतम का पता लगाएं और अधिकतम सरणी
  • मिनीमा/मैक्सिमिया (छवि देखें) का एक नया नया चार्ट बनाता है

enter image description here

 Sub NewGraph() 
    Dim X 
    Dim Y 
    Dim lngRow As Long 
    Dim lngCnt As Long 
    Dim Chr As ChartObject 

    X = Range([a1], Cells(Rows.Count, "b").End(xlUp)) 
    Y = Application.Transpose(X) 

    For lngRow = 2 To UBound(X, 1) - 1 
     If X(lngRow, 2) > X(lngRow - 1, 2) Then 
      If X(lngRow, 2) > X(lngRow + 1, 2) Then 
       lngCnt = lngCnt + 1 
       Y(1, lngCnt) = X(lngRow, 1) 
       Y(2, lngCnt) = X(lngRow, 2) 
      End If 
     Else 
      If X(lngRow, 2) < X(lngRow + 1, 2) Then 
       lngCnt = lngCnt + 1 
       Y(1, lngCnt) = X(lngRow, 1) 
       Y(2, lngCnt) = X(lngRow, 2) 
      End If 
     End If 
    Next lngRow 

    ReDim Preserve Y(1 To 2, 1 To lngCnt) 

    Set Chr = ActiveSheet.ChartObjects.Add(250, 175, 275, 200) 
    With Chr.Chart 

     With .SeriesCollection.NewSeries 
      .XValues = Application.Index(Application.Transpose(Y), 0, 1) 
      .Values = Application.Index(Application.Transpose(Y), 0, 2) 
     End With 
     .ChartType = xlXYScatter 
    End With 

End Sub 
संबंधित मुद्दे