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

Handle Objekte kopieren ohne Schleife zu benutzen.

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 02.02.2012, 16:08     Titel: Handle Objekte kopieren ohne Schleife zu benutzen.
  Antworten mit Zitat      
Hello,

ich habe folgendes Problem:

HandleObjArray a= [obj1 obj2]

ich will dieses Array 30 mal kopieren:

b = [obj1 obj2;
obj1 obj2;
obj1 obj2;
obj1 obj2;
... ];

- so dass jede Zeile in dem ObjArray "b" eine Kopie von "a" ist, dh. hat eigenes Handle und dem Objekt zugewiesener Speicher.

Ich habe es bereit mit for-Schleife gelösst. Geht es aber auch OHNE???

Danke
joekey
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.02.2012, 16:17     Titel:
  Antworten mit Zitat      
wenns n normales array is sollte ja repmat gehn. kann das aber grade nicht testen. oder wenns immer 30 mal ist kannst du dann nicht schreiben b=[a;a;a;a;a...] kenn mich mit obj arrays net aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 11:43     Titel:
  Antworten mit Zitat      
Hello,

Zitat:
wenns n normales array is sollte ja repmat gehn.


... ja das geht, man bekommt aber 30 Handles die auf das erste Objekt hinzeigen (es sind also keine Kopien)... ergo, wenn ich eine Eigenschaft von Obj 22 ändere, dann ist diese Eigenschaft für alle Objekte in der Array geändert.... was eben nicht gewollt ist.

Zitat:
oder wenns immer 30 mal ist kannst du dann nicht schreiben b=[a;a;a;a;a...]


... ist auch nicht die Lösung, da die 30 Objekte nur ein Beispiel war (dies kam aber nicht von meinem Posting heraus - sorry). Die Anzahl der Objekte ist ändert sich dynamisch.

Werde bald ein Beispiel beifügen.

LG
joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 13:30     Titel:
  Antworten mit Zitat      
Hier noch ein Testscript:

Testklasse: cTestObj

Code:
classdef cTestObj < matlab.mixin.Copyable
    %CTESTOBJ Summary of this class goes here
    %   Detailed explanation goes here
   
    properties
        prop
    end
   
    methods
        function obj = cTestObj()
            obj.prop = 1;
        end
    end
   
end


Run script:

Code:
%% STEP1 - create handle obj
origObj = cTestObj();

%% STEP2 - copy handle object using repmat
objArr = repmat(origObj, 10, 1);

%test if obj have same handle
objArr(1) == objArr(2)
objArr(1) == objArr(3)
objArr(1) == objArr(5)

%change property of obj 5
objArr(5).prop = 999;

%check if other objects changed also prop
objArr(1).prop
objArr(2).prop
objArr(3).prop

%% STEP3 - copy handle object using copy method
copied = origObj.copy;

%test if obj have same handle
origObj == copied

%change property of copied object
copied.prop = 111;

%check if origObj prop changed with copied obj
origObj
copied

%% STEP4 - create more (30) copies of handle object

%create empty obj array, initialized for 30 objects
objArr = cTestObj.empty(30, 0);
for i = 1 : 30
   
    objArr(i,1) = origObj.copy;
   
end

%check if origObj has same handle as its copies
origObj == objArr(:)

%change property of copied object in obj array
objArr(5).prop = 555;

%check if we change the prop only in one object of the objArr
objArr(:).prop


Mein Ziel ist das Ergebniss von Schritt 4 aber ohne Schleife benutzen zu müssen.

Danke

LG
Joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 03.02.2012, 15:49     Titel:
  Antworten mit Zitat      
Hallo

so könnte man das lösen
also zuerst replizieren, dann copy erstellen
Code:

origObj = cTestObj();

% % STEP2 - copy handle object using repmat
objArr    = repmat(origObj, 10, 1);
objArr    = copy(objArr);

% test if obj have same handle
objArr(1) == objArr(2)
objArr(1) == objArr(3)
objArr(1) == objArr(5)

% change property of obj 5
objArr(5).prop = 999;

% check if other objects changed also prop
objArr(1).prop
objArr(2).prop
objArr(3).prop
 
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 22:33     Titel:
  Antworten mit Zitat      
Hello Denny,

hehe.... so einfach. Genau das habe ich gesucht und ich war mir sicher, dass es geht.

Für die die mitlesen, hier noch ein Performancevergleich beim kopieren von 1 Milion Objekten:

Code:
tic
objArr = repmat(origObj, 1000000, 1);
objArr = copy(objArr);
toc

tic
objArr1 = cTestObj.empty(1000000, 0);
for i = 1 : 1000000
   
    objArr1(i,1) = origObj.copy;
   
end
toc


Code:
>> runTest
Elapsed time is 27.843560 seconds.
Elapsed time is 55.363331 seconds.


Thx
joekey
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 06.02.2012, 12:06     Titel:
  Antworten mit Zitat      
Hallo,

wenn es sowieso nur darum geht, den Defaultconstruktor aufzurufen, so geht es noch deutlich einfacher/schneller:
Code:

tic
objArr2 = cTestObj.empty(1000000, 0);
objArr2(1000000, 1) = cTestObj;
toc
 


Ergebnis (auf meinem Rechner): 25s / 50s / 2s.

Ciao,
Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 06.02.2012, 21:14     Titel:
  Antworten mit Zitat      
Hello Titus,

richtig, es ist schneller wenn man den Defaultconstruktor aufruft.

Allerdings muss ich in meinem Fall ein existierendes Objekt clonen.

LG
Jozef
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 08.02.2012, 19:02     Titel:
  Antworten mit Zitat      
Hallo Titus,

ich hätte noch eine Frage zu deiner letzten Idee:

Zitat:
tic
objArr2 = cTestObj.empty(1000000, 0);
objArr2(1000000, 1) = cTestObj;
toc


wenn ich jetzt cTestObj mit 2 argumenten erstellen wollte

Code:
classdef cTestObj < matlab.mixin.Copyable
    %CTESTOBJ Summary of this class goes here
    %   Detailed explanation goes here
   
    properties
        prop1
        prop2
    end
   
    methods
        function obj = cTestObj(arg1, arg2)
            obj.prop1 = arg1;
            obj.prop2 = arg2;
        end
    end
   
end


... aber so dass der Constructor die übergebene Array Zeilenweise als Argument verwendet... also 1. Obj erste Zeile, 2. Obj zweite Zeile...

In meinem Beispiel wird bei der erstellung des ersten Objects die gesamte Array übergeben und die weiteren Obj bekommen bei der Erstellung keine Inputargumente. Das führt zu einem Error.

Code:
arg1 = repmat([1 2], 1000000, 1);
arg2 = repmat([8 9], 1000000, 1);

tic
objArr2 = cTestObj.empty(1000000, 0);
objArr2(1000000, 1) = cTestObj(arg1, arg2);
toc


Hättest du/jemand auch eine Idee?

LG
joekey
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.