2010-09-07 15 views
5

मैटलैब में सॉर्ट() कैसे काम कर रहा है? शुद्ध matlab में
कोड: matlab कैसे क्रमबद्ध करते हैं?

q = -0.2461 2.9531 -15.8867 49.8750 -99.1172 125.8438 -99.1172 
49.8750 -15.8867 2.9531 -0.2461 

q = sort(roots(q)) के बाद, मुझे मिल गया:
q = 0.3525 0.3371 - 0.1564i 0.3371 + 0.1564i 0.2694 - 0.3547i 0.2694 + 0.3547i 1.3579 - 1.7880i 1.3579 + 1.7880i 2.4410 - 1.1324i 2.4410 + 1.1324i 2.8365

ठीक है, ठीक से काम करने लगता है
क्ष एक सरणी है!

import numpy as np 
q = np.sort(np.roots(q)) 

और मैं मिल गया:: फिर अजगर में, मैं का उपयोग करें (क्यू के रूप में ऊपर ही है, यह एक np.array है)

[ 0.26937874-0.35469815j 0.26937874+0.35469815j 0.33711562-0.15638427j 
0.33711562+0.15638427j 0.35254298+0.j   1.35792218-1.78801226j 
1.35792218+1.78801226j 2.44104520-1.13237431j 2.44104520+1.13237431j 
2.83653354+0.j  ] 

खैर ... इन दो परिणाम अलग हैं, जिसमें वे तरह अलग ढंग से लग रहे हैं , तो क्या कारण हैं? क्या मैंने कुछ गलत किया? आपका अग्रिम में ही बहुत धन्यवाद!

मेरा जवाब:

def sortComplex(complexList): 
    complexList.sort(key=abs) 
    # then sort by the angles, swap those in descending orders 
    return complexList 

तो अजगर कोड में यह कहते हैं, ठीक काम करता है: SORT के लिए पी

+2

कोशिश 'जड़ों (क्यू)' – Amro

+0

@Amro [पेट (जड़ (क्यू)) argsort()।]: नहीं, कि नहीं होगा काम – serina

+0

मैंने अभी कोशिश की .. (बेशक आपको आयात करने की आवश्यकता है उचित मॉड्यूल) – Amro

उत्तर

4

MATLAB प्रलेखन से:

तो A जटिल प्रविष्टियां हैं r और s , sort उन्हें नियम के बाद के अनुसार आदेश: sort(A) में s से पहलेप्रकट होता है यदि निम्न पकड़ के दोनों:

  • abs(r) < abs(s)
  • abs(r) = abs(s) और angle(r) < angle(s)

दूसरे शब्दों में, एक सरणी जटिल प्रविष्टियां हैं कि पहले आधारित क्रमबद्ध हो जाता है absolute value पर (यानी जटिल परिमाण) उन प्रविष्टियों के, और किसी भी प्रविष्टि जिसमें एक ही पूर्ण मूल्य है, उनके phase angles के आधार पर क्रमबद्ध किया जाता है।

पायथन (यानी numpy) चीजों को अलग-अलग आदेश देते हैं। the documentation Amro linked to in his comment से:

सॉर्ट क्रम जटिल संख्या के लिए कोषगत है। यदि वास्तविक और दोनों काल्पनिक भाग गैर-नैन हैं तो ऑर्डर वास्तविक भागों द्वारा निर्धारित किया जाता है, जब वे बराबर होते हैं, जिसमें केस ऑर्डर काल्पनिक भागों द्वारा निर्धारित किया जाता है।

दूसरे शब्दों में, जटिल प्रविष्टियों वाली एक सरणी को पहले प्रविष्टियों के वास्तविक घटक के आधार पर क्रमबद्ध किया जाता है, और किसी भी प्रविष्टि के बराबर वास्तविक घटकों को उनके काल्पनिक घटकों के आधार पर क्रमबद्ध किया जाता है।

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

आप MATLAB में numpy व्यवहार को पुनः चाहते हैं, एक तरह से आप कर सकते हैं यह एक तरह से सरणी के real और imaginary घटकों पर आधारित सूचकांक बनाने के लिए समारोह SORTROWS उपयोग करने के लिए है प्रविष्टियों, तो जटिल मूल्यों के अपने सरणी के लिए उस तरह सूचकांक लागू होते हैं:

>> r = roots(q); %# Compute your roots 
>> [junk,index] = sortrows([real(r) imag(r)],[1 2]); %# Sort based on real, 
                 %# then imaginary parts 
>> r = r(index) %# Apply the sort index to r 

r = 

    0.2694 - 0.3547i 
    0.2694 + 0.3547i 
    0.3369 - 0.1564i 
    0.3369 + 0.1564i 
    0.3528   
    1.3579 - 1.7879i 
    1.3579 + 1.7879i 
    2.4419 - 1.1332i 
    2.4419 + 1.1332i 
    2.8344   
+0

@gnovice: आह, मुझे मिल गया, लेकिन np.sort(), यह matlab में सॉर्ट() के समान नहीं था? आपका जवाब matlab सॉर्ट के लिए दस्तावेज़ है, मुझे यकीन नहीं है कि np.sort() क्या काम करता है? – serina

+2

"जटिल संख्याओं के लिए सॉर्ट ऑर्डर लेक्सिकोग्राफिक है। [...]": http://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html – Amro

+0

@Amro: मुझे मिल गया, धन्यवाद – serina

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