matlab

2011-09-11 12 views
6

में गतिशील रूप से कक्षाएं बनाना एक संरचना को देखते हुए, MATLAB में कक्षा बनाने का कोई तरीका है? उदाहरण के लिएmatlab

>> p = struct(); p.x = 0; p.y = 0; 
>> p 

p = 

    x: 0 
    y: 0 

>> name = 'Point' 

name = 

Point 

मैं करना चाहते हैं क्या, एक स्ट्रिंग क्लास का नाम और खेतों से युक्त के साथ एक struct मैं स्पष्ट रूप से लिखने के एक फ़ाइल में लिखने के लिए बिना एक वर्ग बनाना चाहेंगे युक्त दिया जाता है परिभाषा।

अभी अगर हम class(p) का उपयोग करते हैं तो हम struct प्राप्त करेंगे। मैं क्या करना चाहता हूं Point प्रकार का ऑब्जेक्ट बनाएं ताकि जब मैं class(obj) करता हूं तो मुझे Point मिलता है।

किसी भी विचार को कक्षा परिभाषा के साथ MATLAB में फ़ाइल लिखने और फिर इसे निष्पादित करने के अलावा इसे कैसे पूरा किया जाए?

+0

आपको गतिशील रूप से बनाए गए वर्गों की क्या आवश्यकता है? – Jonas

+0

@ जोनास, मेरे पास संरचनाओं और इसकी जानकारी के बारे में जानकारी के साथ एक बाइनरी फ़ाइल है। जानकारी में कक्षा का नाम, फ़ील्ड शामिल हैं और फ़ील्ड का डेटाटाइप शामिल है। मैं इस जानकारी को पढ़ सकता हूं और इसे MATLAB में एक साधारण संरचना में संग्रहीत कर सकता हूं, लेकिन मुझे उस वस्तु के प्रकार को नहीं पता होगा जो संरचना है। मैं बाइनरी फ़ाइल के निर्देशों के साथ फ्लाई पर इस ऑब्जेक्ट्स को बनाने में सक्षम होना चाहता हूं। – jmlopez

+0

फ़ील्ड 'नाम' और 'डेटा' के साथ स्ट्रक्चर-सरणी में डेटा संग्रहीत करने के बारे में क्या है, जहां डेटा एक संरचना है, जैसे नाम कहता है, डेटा। – Mikhail

उत्तर

4

या तो आप विशिष्ट कार्यक्षमता (विधि) के साथ जुड़े है उदाहरण के विपरीत Point वर्ग Line वर्ग, इस मामले में आपको कक्षाओं को हाथ से लिखना चाहिए, वैसे भी, या आप एक dynamicprops कक्षा बना सकते हैं जो गतिशील रूप से बनाए गए गुण हो सकता है, और जब तक आपको class नामक विधि को कॉल करने की आवश्यकता नहीं है, तो आप अपने जीवन को बहुत सरल बनाते हैं इसके बजाय classname पर कॉल करके।

classdef myDynamicClass < dynamicprops 
properties (Hidden) 
myClass %# this stores the class name 
end 
methods 
function obj = myDynamicClass(myClassName,varargin) 
%# synopsis: obj = myDynamicClass(myClassName,propertyName,propertyValue,...) 
%# myClassName is the name of the class that is returned by 'classname(obj)' 
%# propertyName/propertyValue define the dynamic properties 

obj.myClass = myClassName; 

for i=1:2:length(varargin) 
addprop(obj,varargin{i}) 
obj.(varargin{i}) = varargin{i+1}; 
end 
end 

function out = classname(obj) 
out = obj.myClass; 
end 

end 
end 
+0

मैं इस तरह की तरह। यदि मैं 'कक्षा' को 'myDynamicClass' ऑब्जेक्ट' कहता हूं तो मुझे 'myDynamicClass' प्राप्त होगा।मैं इसका उपयोग कर परिभाषित फ़ंक्शन का उपयोग कर वास्तविक क्लासनाम की जांच करने के लिए कर सकता हूं। यह सिर्फ एक संरचना से बेहतर व्यवहार करेगा क्योंकि यह जांचने के लिए जांच करेगा कि इसमें सही क्षेत्र हैं या नहीं। धन्यवाद जोनास, अब मुझे बाइनरी फ़ाइल में निर्दिष्ट प्रत्येक वर्ग के लिए एक अलग फ़ाइल लिखनी पड़ेगी। – jmlopez

+0

@jmlopez: आपका स्वागत है। ध्यान दें कि आप सेट भी बना सकते हैं और गतिशील गुणों के लिए विधियां प्राप्त कर सकते हैं, ताकि आप अतिरिक्त कार्यक्षमता जोड़ सकें। त्रुटि की जांच कर रहा है। – Jonas

+0

वापस '11 में मुझे कहना चाहिए था, "ओह सचमुच? मैं सेट कैसे बना सकता हूं और अपनी गतिशील गुणों के लिए तरीकों को कैसे प्राप्त कर सकता हूं?", इस बारे में सोचने के बाद संघर्ष करने के बाद मैं [इस] (http: //stackoverflow.com/a/20810965/788553)। क्या सेट विधि बनाने का सही तरीका है? – jmlopez

1

मुझे वस्तुओं को गतिशील रूप से बनाने के किसी भी तरीके से नहीं पता है, इसलिए मैं कहूंगा कि आपके प्रश्न का उत्तर नहीं है।

कार्य एक struct के साथ क्षेत्रों x, y और classname साथ: हालांकि, अपनी समस्या को हल करने के लिए, मैं बहुत क्या मिखाइल कहा करने के लिए कुछ इसी तरह का प्रस्ताव होगा

p.x=0; 
p.y=0; 
p.classname='Point'; 

और फिर एक समारोह myclass(x) जो x.classname रिटर्न बारे में । किसी कारण से आप class() उपयोग करने के लिए की जरूरत है तुम भी अपने खुद के समारोह जो की जाँच करता है, तो x अपने विशेष structs में से एक है और नहीं तो builtin('class', x) कॉल के साथ ओवरलोड सकता है:

function out=class(varargin) 
if nargin==1 && isstruct(varargin{1}) ... #check if we were given a struct 
    && isfield(varargin{1}, 'classname') ... #...which contains a field classname 
    && ischar(varargin{1}.classname) %# ... which is a string 
    out=varargin{1}.classname; %# ok, our special case :-) 
else 
    out=builtin('class',varargin{:}); %# normal case - call builtin class() 
end 
1

एक समाधान है कि मैं पहले उपयोग किए गए एक MATLAB समारोह है कि इस जानकारी (अर्थात वर्ग के नाम और खेतों) लेता है और एक एम फ़ाइल का निर्माण classdef आवश्यक युक्त लिखते हैं लिखने के लिए है।

यह अच्छी तरह से काम करता है यदि आप इस जानकारी का उपयोग प्रोटोटाइप का वर्णन करने के लिए कर रहे हैं जिसे आप बाद में विस्तार करना चाहते हैं।