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

Cell array

 

GNW
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.10.2015, 14:46     Titel: Cell array
  Antworten mit Zitat      
Hallo,

das Thema gab es ja schon öfter, trotzdem fällt es mir schwer meinen Code zu erstellen.
Ich habe einen langen Vektor mit yPositionen verschiedener Partikel (je nach simulation kommen da auch unteschiedlich viele Partikel vor=der Vektor ist unterschiedlich lang).
Ein Partiekl startet bei etwa y=0.9 und fährt richtung y=0.
Der lange Vektor mit zwei Partikeln sieht also in etwa so aus:
[0.9 0.8 0.2. 0.1 0.001 0.9 0.7 0.6 ...]

Die Anzahl der Positionen pro Parikel ist nichg gleich.

Ich brauche für jeden Partikel einen Vektor/Cell array entsprechend Y1, Y2, Y3....
eval() scheint dafür soweit ich verstanden habe alternativ möglich zu sein, aber nicht die elegante Methode....

Als Beispiel dient mir folgender Code:
Code:

clear all
clc;
for i=1:200
yy(i)=rand;
end

j=1;
j=size(yy);
for i=2:1:j(2)
    if yy(i)>yy(i-1)    %Sobald der neue Wert größer ist als der Vorherige
    l(j)=i;             %hier soll gespeichert werden, wo ein neuer Partikelphad beginnt
    j=j+1;
    end
end
j=1;

number=length(l); %Soll mir die Anzahl der geplanten Schnitte geben

for i=1:number
y={i};
end


Mal eben mit einem weiteren Loop befüllen klappt nicht....Wie bekomme ich da jetzt meine Daten rein?
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.10.2015, 15:04     Titel:
  Antworten mit Zitat      
hallo GNW ein paar anmerkungen meinerseits:
am besten du brichst bei deiner frage das problem immer auf die simplen mathematischen dinge runter und lässt unwichtige dinge weg.
Zitat:
Ich habe einen langen Vektor mit yPositionen verschiedener Partikel (je nach simulation kommen da auch unteschiedlich viele Partikel vor=der Vektor ist unterschiedlich lang).
is es wichtig das es partikel oder orangen sind oder sonst was? matlab ist das meist egal. auch das es yPositionen sind ist nicht sonderlich wichtig oder?
Zitat:
Der lange Vektor mit zwei Partikeln sieht also in etwa so aus:
[0.9 0.8 0.2. 0.1 0.001 0.9 0.7 0.6 ...]

die frage die sich mir hier stellt ist wie dieser velktor überhaupt zustande kommt. anscheinend willst du ihn so ja nicht haben. sinnvoller wäre es ja bei der erstellung einfluss auf den vektor zu nehmen falls das möglich ist.
können partikel auch wieder rückwärts laufen?
Zitat:
Ich brauche für jeden Partikel einen Vektor/Cell array entsprechend Y1, Y2, Y3....
ein vektor und ein cell array sind zwei sehr unterschiedliche dinge. meist ist der sinn dabei grade der nicht den index im namen zu verstecken wie bei Y1 Y2 und so weiter sondern nur Y{1:3} zu haben.
Zitat:
eval() scheint dafür soweit ich verstanden habe alternativ möglich zu sein, aber nicht die elegante Methode....

das stimmt. eval erschwert das debuggen und ist meist für spätere nutzer nicht sehr freundlich. hat aber durchaus manchmal seine berechtigung. hier alledings nicht.
jetzt ein wenig zum code:
Code:
löscht auch die debug marken und alle gespeicherten funktionen. wozu brauchst du das? clear sollte in den meisten fällen auch reichen ist aber meist auch überflüssig
Code:
for i=1:200
yy(i)=rand;
end

das ist auch ohne schleife mit rand(1,200) schnell erledigt.
außerdem ist i die imaginäre einheit und sollte nicht als variable verwendet werden da das sonst zu verwirrung führen kann.
Code:

auch j ist die imaginäre einheit. außerdem warum j mit 1 belegen und dann mit size überschreiben?
Code:

das :1 ist überflüssig. die schrittweite ist immer 1 wenn nicht anders angegeben.

Code:

in j sind die dimensions abmessungen gespeichert. was soll das bewirken?

guck dir mal an was folgender code macht. ich denke das sollte dir helfen.
Code:
x=[0.9 0.8 0.2 0.1 0.001 0.9 0.7 0.6];
ind=find(diff([0,x])>0)

grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
GNW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 08:11     Titel:
  Antworten mit Zitat      
Hallo Winkow,

vielen Dank für deine Anmerkungen! Mit fast allem hast du Recht! Besonders, der Fall ein Partikel bewegt sich rückwerts... Das muss ich erst einmal klären

Die Software von der die dateien kommen sollen heißt OpenFOAM (CFD Software). Sicherlich kann man da auch das Skript umprogrammieren, dass diese Dateien erzeugt - aber wenn ich das kann, das ist das Sortieren von Daten wohl auch kein Problem mehr Very Happy

Ich werde deine Anmerkungen erst einmal verarbeiten!

Vielen Dank!

Gruß
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: 05.10.2015, 10:39     Titel:
  Antworten mit Zitat      
Zitat:
Die Software von der die dateien kommen sollen heißt OpenFOAM (CFD Software). Sicherlich kann man da auch das Skript umprogrammieren, dass diese Dateien erzeugt - aber wenn ich das kann, das ist das Sortieren von Daten wohl auch kein Problem mehr Very Happy

wenn sich partikel zurück bewegen können dann nicht.
[0.9 0.8 0.9 0.9 0.8] das könnten 3 partikel sein oder zwei oder sogar 1. wie willst du das später anhand dieses vektors erkennen ?

Zitat:
Mit fast allem hast du Recht!
mit was davon denn nicht? ich lerne immer gerne dazu. niemand ist unfehlbar und wenn ich falsche anmerkungen mache dann einfach raus damit.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
GNW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 10:43     Titel:
  Antworten mit Zitat      
Genau das ist die Frage!
Ich weiß das die Partikel an einer Position starten z.B. 0.9
aus
Code:
ind=find(diff([0,x])>0)


kann also

Code:
ind=find(diff([0,x])>0 & x>0.85)


werden. Zu mindest mit der Annahme, dass beim Eintritt kein Rückwärtsschritt gemacht wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
GNW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 14:06     Titel:
  Antworten mit Zitat      
Also das Prinzip an sich funktioniert schonmal:
Code:

clc; clear; close all

data_raw = importdata('particleTracks.txt');                  

%%
ind=find(diff([0,data_raw(:,2)'])>0 & data_raw(:,2)' >0.97);       % Finds the positions were new streamline starts
l_ind=length(ind);                                                  % Length of ind

for a=1:l_ind
    if a<l_ind
        for count=ind(a):ind(a+1)
      vecy(count)=data_raw(count,2);
        end
    y{a}=vecy;
    clear vecy;
    end
end

Folgende Probleme gibt es noch:
In dem Cellarray vecy wird am Ende bereits der erste Wert des nächsten Vektors gespeichert, was wohl durch
Code:
for count=ind(a):ind(a+1)

ausgelöst wird. Ich stelle mich nur zu doof an das zu lösen. Hat da jemand einen Tip? Ich habe als Beispiel mal die Textdatei angehängt, die eingelesen wird.

particleTracks.txt
 Beschreibung:

Download
 Dateiname:  particleTracks.txt
 Dateigröße:  39.4 KB
 Heruntergeladen:  303 mal
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: 05.10.2015, 14:32     Titel:
  Antworten mit Zitat      
Code:
data_raw = importdata('particleTracks.txt');                  

%%
ind=find(diff([0,data_raw(:,2)'])>0 & data_raw(:,2)' >0.97);       % Finds the positions were new streamline starts
l_ind=length(ind);                                                  % Length of ind
ind=[ind,size(data_raw,1)+1];
for a=1:l_ind
Y{a}=data_raw(ind(a):ind(a+1)-1,2);
end

anmerkungen:
Code:
wozu brauchst du das?
Code:
length ist hier durchaus möglich. es sei aber darauf hingewisen das length immer die größte dimmension zurück giebt. das kann in manchen dingen zu problemen führen. ich arbeite immer mit size oder numel
Code:
wozu soll das gut sein? du hast keine else anweisung. du könntest also gleich nur bis lind-1 laufen und nicht jedes mal diese abfrage durchführen.
Zitat:
Code:
       for count=ind(a):ind(a+1)
      vecy(count)=data_raw(count,2);
        end

da kannst auch auch gleich schreiben
Code:
vecy=data_raw(ind(a):ind(a+1),2)
eine schleife ist hier überflüssig

noch eine anmerkung: deine daten sind in deinem beispiel immer 76 elemente lang. wenn das immer so ist kannst du dir das allles spaaren und mit einem einfachen reshape arbeiten.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
GNW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 15:07     Titel:
  Antworten mit Zitat      
Code:


Das wurde mir so in der Uni beigebracht, um sicher zu gehen, dass keine alten oder andere Werte mein Skript beeinflussen. Schadet das?

Zitat:
wozu soll das gut sein? du hast keine else anweisung. du könntest also gleich nur bis lind-1 laufen und nicht jedes mal diese abfrage durchführen.


Das ist richtig, die war noch nicht drin. Jetzt aber:

Code:
clc; clear; close all

data_raw = importdata('particleTracks.txt');              
sz_dr=size(data_raw);

%%
ind=find(diff([0,data_raw(:,2)'])>0 & data_raw(:,2)' >0.97);        % Finds the positions were new streamline starts

for a=1:1:length(ind)
    if a<length(ind)
        n=1;
        for count=ind(a):(ind(a+1)-1)
        vecx(n)=data_raw(count,1);    
        vecy(n)=data_raw(count,2);
        vecz(n)=data_raw(count,3);
        n=n+1;
        end
    else
            n=1;
            for count=ind(a):sz_dr(1,1)
            vecx(n)=data_raw(count,1);    
            vecy(n)=data_raw(count,2);
            vecz(n)=data_raw(count,3);
            n=n+1;        
            end
    end
    x{a}=vecx;    
    y{a}=vecy;
    z{a}=vecz;
    clear vecx vecy vecz;
   
end


Ich habe selbst noch ein paar Fehler entdeckt. Die Vektoren sind jetzt aber korrekt soweit!

Wie man sicher schon erahnt, bin ich kein Matlab- Profi. Die Schleifen beutze ich, da ich da abschätzen kann was passiert.

Da der Code jetzt funktioniert, möchte ich nicht, das jemand dort unnötig Zeit verschwendet, jedoch bin ich für Kritik offen, wenn dort eine definitiv einfachere Lösung absehbar ist.

Und um auf die Frage zu antworten ob es immer 76 Elemente sind: Ja, Nein und weiß ich nicht. Das hängt start vom Strömungsverlauf ab, also ehr nein.

Vielen Dank für die Tips bisher!
Gruß
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: 05.10.2015, 15:18     Titel:
  Antworten mit Zitat      
Zitat:
jedoch bin ich für Kritik offen, wenn dort eine definitiv einfachere Lösung absehbar ist.
ich hab bereits eine kürzere version oben gepostet.

Zitat:
Das wurde mir so in der Uni beigebracht, um sicher zu gehen, dass keine alten oder andere Werte mein Skript beeinflussen. Schadet das?

du machst keine wichtigen ausgaben ins command window. da stehen als nur fehlermeldungen drin. ich sehe keinen sinn darin alte fehlermeldungen zu löschen manchmal braucht man die. also für mich kein grund für clc.
wenn man close all benutzt und noch andere guis aufhat und man die handlevisibility nicht auf false gesetzt hat macht man sich damit auch andere fenster zu die man vielleicht noch haben will. ich sehe also auch keinen sinn an close all.
clear ist ok.. meist überflüssig aber ok. wenigstens kein clear all. wenn du angst hast das alte werte dein skript beeinflussen hast du unsauber programmiert. du solltest also lieber da ansetzen als clear zu benutzen. wenn einem klar ist was sein code macht finde ich diesen header unnütz und schadet mehr als er bringt. das ist jedenfalls meine meinung. ich benutze auch manchmal clear und clear all. aber dann halt per hand im command window und nicht immer in jedem skript am anfang.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
GNW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 15:20     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
Zitat:
jedoch bin ich für Kritik offen, wenn dort eine definitiv einfachere Lösung absehbar ist.
ich hab bereits eine kürzere version oben gepostet.

Zitat:
Das wurde mir so in der Uni beigebracht, um sicher zu gehen, dass keine alten oder andere Werte mein Skript beeinflussen. Schadet das?

du machst keine wichtigen ausgaben ins command window. da stehen als nur fehlermeldungen drin. ich sehe keinen sinn darin alte fehlermeldungen zu löschen manchmal braucht man die. also für mich kein grund für clc.
wenn man close all benutzt und noch andere guis aufhat und man die handlevisibility nicht auf false gesetzt hat macht man sich damit auch andere fenster zu die man vielleicht noch haben will. ich sehe also auch keinen sinn an close all.
clear ist ok.. meist überflüssig aber ok. wenigstens kein clear all. wenn du angst hast das alte werte dein skript beeinflussen hast du unsauber programmiert. du solltest also lieber da ansetzen als clear zu benutzen. wenn einem klar ist was sein code macht finde ich diesen header unnütz und schadet mehr als er bringt. das ist jedenfalls meine meinung. ich benutze auch manchmal clear und clear all. aber dann halt per hand im command window und nicht immer in jedem skript am anfang.


Danke für die Ausführung, ich werde versuchen das zu beachten!

Viele Grüße und noch einmal vielen Dank!
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.