goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

Digitale Signalverarbeitung: Filterung und Spektralanalyse

Studierende:
Abschlussarbeit: NOx-Sensor-Fehlersimulationstool in Hard- & Software
Fahrzeugtechnik
MBtech Group GmbH & Co. KGaA - Fellbach-Schmiden

Abschlussarbeit Entwicklung einer Ausgangsstufe für einen PV-Wechselrichter
Energieversorgung
SMA Solar Technology AG - Niestetal

Praktikum Automatisierung von Tests für Zentral-Wechselrichter (Matlab/Simulink)
Energieversorgung
SMA Solar Technology AG - Niestetal

Praktikant / Werkstudent Nachrichtentechnik (m/w)
Telefonanbieter
OnePhone Deutschland GmbH - Erkrath

Sensorlose BLDC-Ansteuerung einer PSM für elektronisch mechanische Stellantriebe
Kfz-Zulieferindustrie
ZF Friedrichshafen AG - Friedrichshafen

weitere Angebote

Partner:




Vermarktungspartner


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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 02.02.2012, 17: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
Forum-Meister
Forum-Meister

Beiträge: 593
Anmeldedatum: 04.11.11
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 02.02.2012, 17: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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 12: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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 14: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: 2606
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2007b, R2009b
     Beitrag Verfasst am: 03.02.2012, 16: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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 03.02.2012, 23: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: 853
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 06.02.2012, 13: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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 06.02.2012, 22: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: 149
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 08.02.2012, 20: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



Options and Permissions
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button 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.