2012-12-13 13 views
7

में सरणी से वास्तविक संख्या निकालें, मैं केवल सरणी से वास्तविक संख्याओं को निकालना चाहता हूं जिसमें काल्पनिक संख्याएं भी हैं मैं सरणी से काल्पनिक संख्याओं को खत्म करना चाहता हूं। इसलिए, केवल 5 तत्वों की सरणी प्राप्त करने के लिए, 10 तत्वों की एक सरणी से, जिसमें से 5 वास्तविक, और 5 काल्पनिक, वास्तविक संख्या तत्व होना चाहिए। इस MATLABमैटलैब

संपादित में:

एक उदाहरण

input_array = [ 1, 1+i, -2+2*j, 3, -4, j ]; 

जोड़ना वांछित आउटपुट

output = [ 1, 3, -4 ]; 

जो input_array का केवल वास्तविक तत्व शामिल होगा।

उत्तर

11

एक अन्य, अधिक vectorized रास्ता:

sel = a == real(a); % choose only real elements 

only_reals = a(sel); 
+0

बहुत बहुत धन्यवाद, आप 150 साल तक अच्छे स्वास्थ्य का आनंद ले सकते हैं !!! – carminePat

3

आप isreal फ़ंक्शन के साथ ऐसा कर सकते हैं। isreal बदलता है वेक्टर आउटपुट नहीं देता है, जो MATLAB के लिए अजीब है, क्योंकि यह आमतौर पर करता है। तो, आपको लूप के लिए उपयोग करने की आवश्यकता है।

arr = [1+i 5 6-3i 8]; 
arrReal = []; 
for idx = 1:numel(arr) 
    if isreal(arr(idx)) 
     arrReal(end+1) = arr(idx); 
    end 
end 

मुझे लगता है कि महान लोग यहां एक लूपलेस समाधान के साथ आएंगे।

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

उत्पादन परिणाम

arrReal = NaN(size(arr)); % pre-allocation 
for idx = 1:numel(arr) 
    if isreal(arr(idx)) 
     arrReal(idx) = arr(idx); 
    end 
end 
arrReal(isnan(arrReal)) = []; % discard non-relevant entries 
बेशक

के पूर्व आवंटन के साथ एक संस्करण, इस लक्ष्य को छोरों के बिना प्राप्त किया जा सकता (अन्य उत्तर देखें)। लेकिन इस लूप संस्करण के लिए, एक पूर्व आवंटन एक महत्वपूर्ण घटक है।

+0

'isreal' का एक दिलचस्प प्रयोग। हालांकि आपके उत्तर में दो प्रमुख दोष हैं: 1. यह एक लूप का उपयोग करता है (जैसा कि आपने पहले ही नोट किया है)। 2. आउटपुट 'arrReal' लूप के अंदर बढ़ता है। इस प्रकार के मेमोरी उपयोग से मैटलैब ** ** वास्तव में धीमा हो जाता है। एक बेहतर तरीका 'arrReal' को' arr' के आकार में पूर्व-आवंटित करना और लूप के बाद अनावश्यक भाग को निकालना है। किसी भी तरह, आपके उत्तर के लिए धन्यवाद! – Shai

+0

@Shai मैंने प्रीलोकेशन के बारे में सोचा था लेकिन एक और इंडेक्स वैरिएबल रखने के अलावा इंडेक्स 'एआरआरईएल' के सूचकांक के साथ नहीं आया। तो, मैंने फैसला नहीं किया। लेकिन मुझे शायद वैसे भी होना चाहिए। क्या आप एक और चालाक तरीका जानते हैं? – HebeleHododo

+0

मैंने अभी आपका जवाब संपादित किया है और प्री-आवंटन के साथ एक संस्करण जोड़ा है। उम्मीद है आप इसे पसंद करते हैं। – Shai

5

यदि संख्या वास्तविक और/या real सिर्फ वास्तविक भागों रखने के लिए कर रहे हैं की जाँच करने के arrayfun के साथ संयोजन में isreal उपयोग कर सकते हैं। उदाहरण:

a = [1+i 2 3 -1-i]; 
realidx = arrayfun(@isreal,a); 
only_reals = a(realidx); 
only_real_part = real(a); 

>> only_reals 

    = [ 2 3] 

>> only_real_part 

    = [1 2 3 -1] 
+0

+1 मैं हमेशा सरफन के बारे में भूल जाता हूं। – HebeleHododo

+0

मूल रूप से यह एक लूप भी है, लेकिन यह एक-लाइनर –

+1

@ गुनथरस्ट्रूफ के लिए अच्छा है उम्मीद है कि भविष्य में रिलीज होने पर सभी '* मज़ेदार कार्यों को कुशलतापूर्वक कार्यान्वित किया जाएगा (समांतर या कुछ ...) – Shai

4

रियल संख्या शून्य का एक काल्पनिक हिस्सा है, तो:

input_array(imag(input_array)==0); 

ans = 
    1  3 -4