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

Maximale Dimension von Vektor in Vektorstruktur

 

DerBrain87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2016, 11:49     Titel: Maximale Dimension von Vektor in Vektorstruktur
  Antworten mit Zitat      
Hallo liebe Matlab-Gurus,
ich habe eine Funktion die mir eine Struktur mit den Feldern 'Name' und 'Data' zurück gibt. Diese Rückgabe wird in einem Array gespeichert. Zu beachten ist, dass die Dimension von 'Data' variable ist.

Das Array, in welchem die Strukturen gesammelt sind, nenne ich mal A.
Ich suche nun eine Funktion die mir die maximale Dimension von A.Data zurück gibt.

Mir ist klar, dass ich über eine For-Schleife durch die einzelnen A(i) gehen kann, möchte jedoch die bösen For-Schleifen vermeiden:-)

Ich habe mich bereits mit den Funktionen structfun und arrayfun versucht, bin jedoch gescheitert:-(

Ich hoffe ich konnte mein Problem genügend gut erklären und bedanke mich schonmal im Vorraus für die Hilfe:-)

Gruß DerBrain87


DerBrain87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2016, 11:57     Titel: Nachtrag
  Antworten mit Zitat      
Nachtrag:
Zusätzlich wäre es schön, wenn ich ein Vektor B erhalten könnte, für den gilt:
B(i) = A(i).data(1);

Mir ist natürlich bewusst, dass ich hier mit der langsamen For-Schleife arbeiten könnte...

Gruß DerBrain87
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.03.2016, 12:25     Titel:
  Antworten mit Zitat      
Hallo,

immer mal wieder zu lesen...diese Schleifenphobie. Dabei machen viele Matlabuser den Fehler, den benötigten Speicherplatz von Arrays/Matrizen in der Schleife nicht vorher festzulegen. Matlab muss dann bei jedem Schritt, bei dem ein Array wächst, erst wieder kopieren und neu anlegen. Das macht die Schleifen i.d.R. langsam und nicht Schleifen sind generell langsam.

Ist die Nutzung einer for-Schleife hier wirklich zu langsam? Bitte testen...

Code:

A = struct('Name',{'Name 1','Name 2','Name 3'},'Data',[]);
A(1).Data = [1 2 3];
A(2).Data = [1; 2; 3; 4; 5; 6];
A(3).Data = [1 2 3 4 5];

% wichtig preallocate
B = zeros(size(A));
maxDim = 0;
for i=1:size(A,2)
    % get array length and compare to maxDim
    maxDim = max([maxDim length(A(i).Data)]);
    % copy first data element
    B(i) = A(i).Data(1);
end
 


Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
DerBrain87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.03.2016, 12:58     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort.
Vorab muss ich sagen, dass ich immer brav meine Felder vorher in der passenden Größe initialisiere. Zumeist nicht mit Nullen sondern mit NaN aber das ist ja grundsätzlich mal egal.
Meine Schleifen-Phobie kommt einfach daher, dass ich schon festgestellt habe, dass die Varianten ohne Schleifen oftmals um das 10fache schneller sind.

In meinem diskreten Fall funktioniert die Schleifenvariante schon. 'Zu langsam' ist immerhin ein dehnbarer Begriff. Ich hattte/habe nur die Hoffnung, dass es für mein Problem eine 'Vektor'-Variante gibt die einfach schneller ist.
Immerhin finde ich es ist eine Form von 'schönen und ordentlichem' Programmieren die Variante zu wählen die am wenigsten Zeit benötigt:-)

Gruß DerBrain87
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.03.2016, 13:01     Titel:
  Antworten mit Zitat      
Zitat:
Immerhin finde ich es ist eine Form von 'schönen und ordentlichem' Programmieren die Variante zu wählen die am wenigsten Zeit benötigt:-)

die zeit die ein programm benötigt setzt sich zusammen aus programmierzeit, laufzeit und Debug zeit.
das programm in fühen stadien schon auf laufzeit zu trimmen und dabei überischtlichkeit einzubüßen ist nicht gut. wenn dein programm vertig ist kannst du mit dem profiler gucken wo rechenzeit verloren geht und dir dann gedanken machen ob es sich lohnt da nochmal zu optimieren.
Code:
würde zb auch funktionieren in deinem beispiel.. aber ist das leicht zu durchschauen?
_________________

richtig Fragen
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: 04.03.2016, 13:34     Titel: Re: Nachtrag
  Antworten mit Zitat      
Hallo DerBrain87,

Ich verstehe da Porblöem noch nicht ganz. Du suchst der "der maximalen Dimension". Meinst Du die höchste Anzahl an Dimensionen, die maximale Anzahl von Elementen, oder die größte Länge irgendeiner der Dimensionen?
Was hat das hiermit zu tun:
Code:
B(i) = A(i).data(1);


Winkows Vorschlag ist schön und effizient:
Code:

Allerdings wird hierfür das temporäre Array {A.Data} gebildet. Dies wird nur kurz einmal gebraucht und danach wieder verworfen, was Zeit verschwendet. In solchen Fällen könnte eine Schleife schneller sein.

Andere Möglichkeiten:
Code:
max(cellfun('length',{A.Data}))
max(cellfun('ndims', {A.Data}))
max(cellfun('prodofsize', {A.Data}))
 

Die String-Methoden von CELLFUN werden leider nur noch als "Backward Compatibility" in der Dokumentation erwähnt. Das ist schade, denn sie sind viel effizienter als die entsprechenden anonymen Function Calls.

Gruß, Jan
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 - 2025 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.