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

Preallocation eines Cell-Arrays (und dynamisch erweitern)

 

punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 12.07.2016, 13:04     Titel: Preallocation eines Cell-Arrays (und dynamisch erweitern)
  Antworten mit Zitat      
Hallo Zusammen,

möchte gerne diese Warnmeldung lösen:
The variable 'Daten' appears to change size on every loop iteration. Consider preallocation for speed.

Code:

function erweitern(Anzahl)

  % Funktionsaufruf (Rückgabewert kann verschieden sein)
  Daten = grunddaten();
 
  %% Neue Daten hinzufügen
  for AktuellesElement=1:Anzahl
    % Vorher eine bestimmte Bedingung abfragen
    if mod(AktuellesElement, 2)
      % Wenn Bedingung erfüllt, neues Element hinzufügen
      Daten{end+1} = AktuellesElement; % Warnmeldung an dieser stelle
    end
  end
 
end

function Daten = grunddaten()
  % Rückgabe einer beliebigen Datenmenge
  Daten = {1,2,3};
end

 


Wenn ich nicht vorher den Funktionsaufruf habe, könnte ich eine Preallocation anstelle des Funktionsaufruf folgenermaßend durchführen:
Code:

Daten = cell.empty;
 


Weiß jemand, wie ich in diesem Falle eine saubere Programmierung hinbekomme?
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 14:04     Titel:
  Antworten mit Zitat      
Hallo,

mache schon vorher eine Cell-Array aus der Variable Daten (falls du weißt wie groß sie wird):

Code:

Daten = cell(1,anzahl);
 


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 12.07.2016, 14:37     Titel:
  Antworten mit Zitat      
Hey schon wieder Du, danke das Du hilfsbereit bist. Smile

Der Aufruf:
Code:

Daten = grunddaten();
 


gibt ja schon ein Rückgabewert mit unbekannter Größe zurück.

Anzahl ist ja nur - in diesem Fall - die maximale Anzahl an Elemente die dazukommen können, aber dies wird ja noch durch eine Bedingung beeinflußt:

Code:

if mod(AktuellesElement, 2)
    % Wenn Bedingung erfüllt, neues Element hinzufügen
    Daten{end+1} = AktuellesElement;    % Warnmeldung !!
 end
 


Daher ist die größe des Cell-Arrays von mehreren Faktoren abhängig:
1. erster funktionsaufruf
2. Bedingung in der for-schleife

Ein...
Code:

Daten = cell(1,anzahl);
 


...am Anfang bringt nur die zusätzliche Warnmeldung:
The variable 'Daten' appears to be preallocated, but preallocation is not recommended here.

Und die andere Warnmeldung geht dadurch nicht weg.
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 14:48     Titel:
  Antworten mit Zitat      
Hallo,

ich würde sogar die Schleife weg tun wie folgt:

Code:

temp = 1:Anzahl;
AktuellesElement = temp(mod(temp,2)==1);

Daten(end+1:end+length(AktuellesElement)) = num2cell(AktuellesElement);
 


lg Rob
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 12.07.2016, 15:17     Titel:
  Antworten mit Zitat      
Funktioniert einwandfrei, erstmal Danke dafür. Smile

*Ui ui ui* einfach nachzuvollziehen ist das für mich nicht. Shocked
Ich bin ja kein Freund von solch verschachtelten Aufrufen (vll. weil ich kein Informatiker bin Wink ), ist ja nicht gerade einfach bei einer Fehlersuche zu debuggen.
Allerdings hast du mir auch damit gezeigt, dass ich vll. versuchen sollte weniger mit for-Schleifen auszukommen. Idea


Wie so ist für MATLAB an dieser Stelle:
Code:

Daten(end+1:end+length(AktuellesElement)) = num2cell(AktuellesElement);
 


...die Speicherbereitstellung kein Problem mehr? Weil er den Speicher einmal um length(AktuellesElement) erweitert wird?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.07.2016, 19:43     Titel:
  Antworten mit Zitat      
Hallo,

man sollte romats Code so umschreiben können:

Code:
Bedingung = mod(temp,2)==1;
AktuellesElement = temp(Bedingung);

Daten = [Daten, num2cell(AktuellesElement)];


Wenn es keine Performance-Probleme macht, kann man die Warnung auch gerne mal ignorieren. Wenn man nicht möchte, dass sie weiter angezeigt wird: Rechts-Klick --> Suppress.

Grüße,
Harald
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.