Ich vergleiche immer den einen mit dem nächsten. Bei letzten allerdings gibt es kein nächsten. So muuss ich die for-schleife um einen Verkürzen, was dazu führt das ein Index fehlt. Der letzte müsste noch mit dem ersten verglichen werden.
Gibt es eine Möglichkeit ihm zu sagen dass er alle ausser die gewählten (je nach DZR1-Vektor können es auch mehrere sein) nehmen soll? Irgendwie so:
Code:
c=1;
for z =1:length(DRZ1)-1 ifeval(sprintf(DRZ1(%d)==DRZ1(%d) | Mom1(%d)==Mom1(%d);',z,z+1,z,z+1));
zahl(c)=z;
c=c+1;
Sind alle doppelten herausgesucht, dann sollen die gleichen Betriebspunkte herausgesucht werden. Hier habe ich einiges probiert, aber nichts war zielführend. Wäre super wenn jemand eine Idee, eine Lösung oder einen Lösungsansatz hätte.
Hi,
habe ich das richtig verstanden, dass Du aus Deinen Betriebspunkten einfach nur den doppelten finden willst? Es gibt also immer nur einen der doppelt ist? Dann kannst Du das so machen:
% Multipliziert man die beiden Vektoren, dann erhält man für jeden % Betriebspunkt einen Wert. Gibt es hier zweimal den gleichen, dann hast du % einen Betriebspunkt doppelt. % Bei DRZ1=0, gibt es aber einen Fehler, wegen 0*irgendwas immer 0 ergibt. % Deshalb erst mal auf jeden Wert eine 1 addieren.
vektor1 = (DRZ1+1).*Mom1;
vektor2 = (DRZ2+1).*Mom2;
% Sucht noch mehrfachen Werten % Ausgabe: % hwert = Der erste Wert, der mehrfach vorkommt % woft = Wie oft der Wert "hwert" vorkommt % gsoft = Falls mehrere Werte mehrfach vorkommen, werden die hier % gespeichert. - Dann wird es etwas aufwendiger. [hwert1, woft1, gsoft1] = mode(vektor1);
if woft1 == 1
%Es gibt keine doppelten Werte
else
doppelte_zahlen = find(vektor1==hwert1);
end
Hab das jetzt nur mal mit dem ersten Vektor gemacht. Den zweiten musst du gleich untersuchen. Wenn es mehr gibt, dann musst du die if-Abfrage noch in eine Schleife packen.
Gruß, Ben
Zuletzt bearbeitet von ben am 19.06.2009, 15:07, insgesamt 2-mal bearbeitet
Jonny
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.06.2009, 12:18
Titel: antwort
Hi ,
Danke erstmal
die Funktion "mode" kannte ich noch nicht. Bei mehreren doppelten wird es dann aber auch komplexer, oder? Ich werde das mal testen.
Gibt es für den Vergleich der Betriebspunkte bzw das Raussuchen der gleichen Betriebspunkte auch eine geschickte Lösung?
Jonny
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.06.2009, 12:38
Titel: antwort
Das heraussuchen der doppelten habe ich jetzt so gelöst. Scheint auch zu funktionieren:
Code:
[hwert1, woft1, gsoft1] = mode(vektor1);
if woft1 == 1
%Es gibt keine doppelten Werte
else for i=1:length(gsoft1{1})
doppelte_zahlen = [find(vektor1==gsoft1{1}(i))];
index_doppelt(i) =doppelte_zahlen(1) %gibt Indices der doppelten Werte aus --> diese sollten später keine Verwendung finden
end end
jetzt bekomme ich alleridngs die Indices die nicht verwendet werden sollen. Das müsste ich ihm jetzt irgendwie mitteilen DRZ1 (alle ausser Indices) und dann bin ich wieder bei dem Problem, dass ich mit meiner oben vorgestellten Lösung auch hatte.
Ja mit dem Löschen das habe ich auch gemacht. Finde die Lösung aber nicht so gut, da die Werte dann einfach weg sind. Fände es gut wenn einer der es später durchschaut sieht, das von der Messung bestimmte Punkte weggelassen wurden.
Daher ist die "Weglassmethode" zwar einfach aber nicht optimal. Besser wäre es wie schon erwähnt die gefundenen Indices wegzulassen.
Ich stehe wohl gerade etwas auf dem Schlauch...Wenn Du einen zusätzlichen Vektor haben willst, in dem nur die nicht doppelten Werte stehen, du aber nicht den "alten" löschen willst, dann kannst du das ja vielleicht so machen:
Kann sein, dass es eine schönere Variante gibt, aber auf die schnelle sollte die gehen.
P.s. Mit dem Fehler hast Du recht! Hatte ich falsch gemacht. Habs korrigiert.
Jonny
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.06.2009, 13:47
Titel:
Ja so hatte ich das auch gemacht. Aber ich brauche die Indices, weil ich in einer Struktur noch hunderttausende andere Vektoren habe die ich dann über die Indices auswerte.......Aber ich habe das jetzt gelöst.
Jetzt ist die entscheidende Frage, wie in aller Welt suche ich die gleichen Betriebspunkte der beiden Messungen heraus?
Damit schreibst Du in einen Vektor (gleicher_betriebspunkt) in die erste Spalte den Index des Vektors 1 und in die zweite Spalte den Index des Vektors 2, an dem beide gleich sind.
Jonny
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.06.2009, 14:46
Titel:
Ich glaub ich habe es jetzt. Ich danke dir ersteinmal für deine Hilfe Ben.
Ich hatte es erst wieder über die mode Funktion versucht:
Der Befehl sucht nur nach den Werten, die am häufigsten vorkommen! Gibt es einen zweiten Wert, der gleich oft vorkommt, dann trägt er den Wert in gsoft_gesM aus. Bei deinem Bsp. gibt es aber keinen zweiten Wert mit so viel Werten.
Für dein Bsp. sollte man doch noch mal nach einer anderen function schauen...
function[Index1,Index2] = Betriebspunkt_Vergleich(DRZ1,Mom1,DRZ2,Mom2) % aus Drehzahl und Drehmoment zweier verschiedener Messungen können % gemeinsame Betriebspunkte gesucht werden % benötigt werden (Drehzahl1 Moment1 Drehzahl2 Moment2) % Herausgegeben werden [Index1 Index2]
%Multipliziert man die beiden Vektoren, dann erhält man für jeden
%Betriebspunkt einen Wert. Gibt es hier zwei mal den gleichen, dann hast du
%einen Betriebspunkt doppelt.
%Nötig da es bei DRZ1=0 einen Fehler gibt, wegen 0*irgendwas immer 0 ergibt.
%Deshalb erst mal auf jeden Wert eine 1 addieren.
vektor1 = (DRZ1+1).*Mom1;
vektor2 = (DRZ2+1).*Mom2;
%% gleiche Drehzahl und Drehmomente heraussuchen (einzeln)
a=1;
for ii = 1:length(DRZ1) for kk = 1:length(DRZ2) if DRZ2(kk) == DRZ1(ii)
gleicher_betriebspkt(a,:) = [ii kk];
a=a+1;
end end end
a=1;
for ii = 1:length(Mom1) for kk = 1:length(Mom2) if Mom2(kk) == Mom1(ii)
gleicher_betriebspkt2(a,:) = [ii kk];
a=a+1;
end end end
%% Nur die Punkte nehmen in den beides (drehzahl und Drehmoment)übereinstimmt
a=1;
for ii = 1:length(gleicher_betriebspkt) for kk = 1:length(gleicher_betriebspkt2) if gleicher_betriebspkt2(kk,:) == gleicher_betriebspkt(ii,:)
gleicher_betriebspkt3(a,:) = gleicher_betriebspkt(ii,:);
a=a+1;
end end end
Wenn ich mir aber dein code anschaue, dann habe ich nicht wirklich dazu beigetragen!
Jonny
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.06.2009, 16:02
Titel:
Naja Der Code besteht ja im Grunde nur aus 3 Vorschleifen und die kommen von dir.
Nochmal zum Durchsuchen eines Vektors nach doppelten Einträgen:
Der hier sollte dann wohl bei mehreren Einträgen die doppelt sind nicht mehr funktionieren, weil er auf der "mode"-Funktion aufbaut, richtig?
Code:
%Sucht noch merfachen Werten
%Ausgabe:
% hwert = Der erste Wert, der mehrfach vorkommt % woft = Wie oft der Wert "hwert" vorkommt % gsoft = Falls mehrere Werte mehrfach vorkommen, werden die hier % gespeichert. - Dann wird es etwas aufwendiger. [hwert1, woft1, gsoft1] = mode(vektor1);
[hwert2, woft2, gsoft2] = mode(vektor2);
if woft1 == 1 disp('Es gibt keine doppelten Werte in Vektor 1')
Matrix1=[DRZ1' Mom1'] else for i=1:length(gsoft1{1})
doppelte_zahlen1 = [find(vektor1==gsoft1{1}(i))];
index_doppelt1(i) =doppelte_zahlen1(1) %gibt Indices der doppelten Werte aus --> diese sollten später keine Verwendung finden
end
DRZ1_kurz = DRZ1;
Mom1_kurz = Mom1;
%NaN für alle doppelten Betriebspunkte aus dem Vektor
DRZ1_kurz(index_doppelt1(:))= NaN;
Mom1_kurz(index_doppelt1(:))= NaN;
Matrix1=[DRZ1_kurz' Mom1_kurz'] % Indices der genommen Werte aus 1
Index1 = find(isnan(DRZ1_kurz)~=1) end
Dieser wiederum ist mir aufgefallen durchsucht natürlich nur die nachfolgenden Einträge im Vektor auf gleiche Einträge. Er schaut nicht quer. Mal schaun wie ich das noch mache.
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.