2012-12-10 8 views
6

यदि आप संपत्ति संरचना के माध्यम से एक साजिश की प्रतिलिपि बनाना चाहते हैं तो आपको केवल पढ़ने वाले गुणों (जैसे एनोटेशन, बीइंगडिटेड, पैरेंट, टाइप) को फ़िल्टर करना होगा। क्या ऑब्जेक्ट के लिए केवल पढ़ने के गुणों की सूची प्राप्त करने का कोई तरीका है?साजिश के लिए केवल संपत्ति नामों की एक सूची प्राप्त करें

सवाल एक संबंधित सवाल से पैदा हुई

How can I plot from a plot handler?

उत्तर

6

कुछ का उपयोग नहीं मैं गतिशील जो खेतों थे यह पता लगाने की कोशिश कर पिछले प्रश्न के साथ चारों ओर गंदगी के लिए शुरू कर दिया, settable।

मुझे इसे काम करने में काफी कुछ नहीं मिला लेकिन मैं set(h) और get(h) के वापसी मूल्यों के बीच अंतर का उपयोग करके केवल पढ़ने के गुणों को प्राप्त कर सकता हूं।

एकमात्र ऐसी संपत्ति जो यहां दिखाई नहीं देती है वह Parent -प्रोपर्टी जो सेटटेबल है लेकिन पिछले प्रश्न में इसे बदला नहीं जाना चाहिए।

h = plot(1:0.2:10); 
xx=get(h) 

close all 
h2 = plot(0); 
settableHandles = set(h2); 
settableNames = fieldnames(settableHandles); 
allHandles = get(h2); 
allNames = fieldnames(allHandles); 

nonSettableHandles = rmfield(allHandles,settableNames); 
nonSettableNames = fieldnames(nonSettableHandles) 

यह nonSettableNames की एक सेल का उत्पादन:

यहाँ कैसे मैं गैर settable गुण मिल गया है

nonSettableNames = 

    'Annotation' 
    'BeingDeleted' 
    'Type' 
+2

मुझे लगता है कि आप सब कुछ एक लाइनर में कम कर सकते हैं: 'fieldnames (rmfield (get (h), fieldnames (set (h)))'। बहुत चालाक, +1। एक लाइनर के लिए –

+2

@EitanT +1! – user1884905

+0

+1 - मैंने कभी यह भी नहीं देखा कि मुझे 'सेट' से वापसी मूल्य मिल सकता है! – Jonas

2

क्यों की तरह

try 
    %// [set property] 

catch ME 
    if ~isempty(regexp(ME.error, 'read only')) 
     continue; 

    else 
     %// [handle other error] 

    end 

end 
+0

अच्छा - ट्राई/कैच ब्लॉक मैटलैब में महंगे हैं? – ccook

+0

कॉपीबोज पर चर्चा की गई है, लेकिन यह प्लॉट हैंडलर का उपयोग सीधे साजिश गुणों का नहीं करता है :) – ccook

+1

ठीक है, वे * हो सकते हैं, खासकर जब एक लूप में उपयोग किया जाता है; 'एमई' भाग 'मेक्सप्शन' वर्ग का आह्वान है, जो गैर-निर्मित है, इसलिए किसी भी लूप को जेआईटी द्वारा तेज नहीं किया जाएगा। लेकिन जब भी आप बाहरी कॉल का उपयोग कर रहे हों तो यह लागू नहीं होगा। इसके अलावा - मुझे लगता है कि यह संभव नहीं है कि आपकी 'कोशिश करें ... पकड़' वास्तव में बाकी सभी की तुलना में बहुत महंगी होगी। –