Handle Objekte kopieren ohne Schleife zu benutzen.
joekey
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 02.02.2012, 17:08
Titel : Handle Objekte kopieren ohne Schleife zu benutzen.
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
Winkow
Forum-Meister
Beiträge: 593
Anmeldedatum: 04.11.11
Wohnort: ---
Version: R2011a
Verfasst am : 02.02.2012, 17:17
Titel :
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.
joekey
Themenstarter
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 03.02.2012, 12:43
Titel :
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
joekey
Themenstarter
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 03.02.2012, 14:30
Titel :
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
denny
Supporter
Beiträge: 2606
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2007b, R2009b
Verfasst am : 03.02.2012, 16:49
Titel :
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
joekey
Themenstarter
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 03.02.2012, 23:33
Titel :
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
joekey
Themenstarter
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 06.02.2012, 22:14
Titel :
Hello Titus,
richtig, es ist schneller wenn man den Defaultconstruktor aufruft.
Allerdings muss ich in meinem Fall ein existierendes Objekt clonen.
LG
Jozef
joekey
Themenstarter
Forum-Century
Beiträge: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
Verfasst am : 08.02.2012, 20:02
Titel :
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
Options and Permissions
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
goMatlab ist ein Teil des goForen-Labels
Impressum
| Werbung/Mediadaten
| Studentenversion
| FAQ
| RSS
Copyright © 2007 - 2012
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de
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.