WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

typecast mit selbstgeschriebener Klasse

 

Lloyd Blankfein
Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2012, 11:21     Titel: typecast mit selbstgeschriebener Klasse
  Antworten mit Zitat      
Hallo,

ich habe diese Klasse geschrieben:
Code:

classdef Model_Struct <handle
    %Representiert einen Modelkontainer mit allen benoetigten Parametern.
    %   Die Klasse verwaltet alle fuer ein Model benoetigten Daten.
    %   param enthaelt saemtliche Parameter die fuer das Model von
    %   beudeutung sind.
   
    properties
        id;
        name;
        typ;
        class_id;
        param;
        tables;
        von;
        bis;
        rawdata_type;
        rawdata;
        Model;
        holidays;
        Composite_Indicator;
        Composite_Signal;
        ModelContainer;%Composite only
        Simu_Indicator;
        SimuResult;
    end
   
    methods
       
        %% Constructor
        function MS = Model_Struct(id,name,typ,classid,parameter,tables,von,bis,rawdata_type,rawdata,model,holidays,composite_indicator,composite_signal,modelcontainer,simu_indicator,simuresult)

            MS.id = id;
            MS.name=name;
            MS.typ=typ;
            MS.class_id=classid;
            MS.param=parameter;
            MS.tables=tables;
            MS.von=von;
            MS.bis=bis;
            MS.rawdata_type=rawdata_type;
            MS.rawdata=rawdata;
            MS.Model=model;
            MS.holidays=holidays;
            MS.Composite_Indicator=composite_indicator;
            MS.Composite_Signal=composite_signal;
            MS.ModelContainer=modelcontainer;
            MS.Simu_Indicator=simu_indicator;
            MS.SimuResult=simuresult;
        end%constructor
               
    end%methods
   
end


 


In einer anderen Datei greife ich auf Objekte dieser Klasse zu:

Code:

        function model = getModels()
...
            global ModelContainer selectedModel;
            modelids=zeros(1,size(ModelContainer,2));
            for j=1:size(ModelContainer,2)
                modelids(1,j)=ModelContainer(1,j).id;
            end
            for j=1:size(selectedModel.Composite_Indicator,2)
                [~, index] = ismember(selectedModel.Composite_Indicator(1,j).mid, modelids);
                model(j)=ModelContainer(1,index);
                model(j).Model=0;
                model(j).von=selectedModel.von;
                model(j).bis=selectedModel.bis;
            end
        end%function getModels
 


Die Variable model die mit Objekten der obigen Klasse Model_Struct gefüllt wird würe ich gerne vorab deklarieren. Wie das im Falle einer "nicht-Standard"-Klasse geht ist mir aber nicht klar!

Das klappt z. B. nicht:
Code:

model=cell(1,size(selectedModel.Composite_Indicator,2));
model = typecast(model, 'Model_Struct')
 


Hat jemand eine Idee?

Vielen Dank für eure Hilfe!
Lloyd
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2012, 09:53     Titel: Re: typecast mit selbstgeschriebener Klasse
  Antworten mit Zitat      
Hallo Lloyd Blankfein,

Wenn ich es richtig verstehe, ist das Casten überflüssig. Die CELL ist eine Liste von beliebigen Variablen. Nach dem Erstellen enthält sie NULL-Pointer und es ist nicht hilfreich diesen einen Typ zuzuweisen. Vor allem musst und darfst Du nicht dem CELL-Array einen anderen Typ zuweisen. Dir geht es ja, wenn ich Dich richtig verstehe, um die Elemente des CELLs, oder?

TYPECAST ändert übrigens den Type einer Variablen ohne die Daten zu ändern. Ein CAST dagegen interpretiert die Werte so, dass sie zum neuen Typ passen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lloyd Blankfein
Themenstarter

Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2012, 11:54     Titel:
  Antworten mit Zitat      
Hallo Jan,

Code:

                model=cell(1,size(selectedModel.Composite_Indicator,2));
                for j=1:size(selectedModel.Composite_Indicator,2)
                    [~, index] = ismember(selectedModel.Composite_Indicator(1,j).mid, modelids);
                    model(j)=ModelContainer(1,index);
                    model(j).Model=0;
                    model(j).von=selectedModel.von;
                    model(j).bis=selectedModel.bis;
                end
 


obiger code führt zu dieser Fehlermeldung:

Zitat:

??? The following error occurred converting from myObject.Data.DataObjects.Model_Struct to cell:
Error using ==> cell
Conversion to cell from myObject.Data.DataObjects.Model_Struct is not possible.


Irgendetwas muss da also konvertiert werden!?

Allerdings wird diese Schleife selten genutzt und die Speicherallokation mit jeder Iteration ist deshalb nicht wirklich dramatisch.

Gruß,
Lloyd
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.10.2012, 13:18     Titel:
  Antworten mit Zitat      
Hallo Lloyd Blankfein,

Wenn "model" ein CELL Arrays ist, versucht:
Code:
model(j)=ModelContainer(1,index);

den Wert von "ModelContainer(1,index)" in einen skalares CELL-Element zu konvertieren, weil auf der linken Seite ja ein solches steht.

Ich vermute, Du möchtest dies erreichen:
Code:
model{j} = ModelContainer(1,index);

Also mit geschweiften Klammern. Dann wird "ModelContainer(1,index)" im CELL-Element gespeichert. Das ist etwas ganz anderes.

"model = cell(1,1); model(1)=5" würde ebenfalls scheitern, da man "5" nicht in ein CELL umwandeln kann.

Wenn Du aber gar kein CELL-Array möchtest, sondern ein Struct-Array, wäre es eine effiziente Methode, die Schleife rückwärts laufen zu lassen:
Code:
for jj = size(selectedModel.Composite_Indicator,2):-1:1
                    [~, index] = ismember(selectedModel.Composite_Indicator(1,jj).mid, modelids);
                    model(jj)=ModelContainer(1,index);
                    model(jj).Model=0;
                    model(jj).von=selectedModel.von;
                    model(jj).bis=selectedModel.bis;
end

Wenn man das letzte Element erzeugt, werden die vorhergehenden automatisch initialisiert, was man auch "implizite pre-allocation" nennt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lloyd Blankfein
Themenstarter

Forum-Century

Forum-Century



Beiträge: 149
Anmeldedatum: 23.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2012, 14:42     Titel:
  Antworten mit Zitat      
Zitat:
Wenn Du aber gar kein CELL-Array möchtest, sondern ein Struct-Array, wäre es eine effiziente Methode, die Schleife rückwärts laufen zu lassen:


Super, das war genau was ich meinte.

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.