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....
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
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:
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
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.
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
Ich werde deine Anmerkungen erst einmal verarbeiten!
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
_________________
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.
%%
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
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
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.
_________________
%%
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;
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.
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.
_________________
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!
Einstellungen und Berechtigungen
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
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.