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

Vergleich von Vektoren

 

Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 09:55     Titel: Vergleich von Vektoren
  Antworten mit Zitat      
Ich habe 2x2 Vektoren:
DRZ1=[0 0 1000 2000 2000 3000 3000 3500 4000 4000 5000 4500];
Mom1=[-20 -10 50 100 80 150 200 100 100 100 300 150];

DRZ2=[1000 2000 3000 3500 3000 4500];
Mom2=[50 100 80 150 150 300];

Dabei stellt ein Paar DRZ1/Mom1 jeweils ein Betriebspunkt dar.

Zu Beginn möchte ich den dopellten Betriebspunkt in DRZ1/Mom1 heraussuchen:

Code:
c=1;
for z =1:length(DRZ1)-1
    if eval(sprintf(DRZ1(%d)~=DRZ1(%d) | Mom1(%d)~=Mom1(%d);',z,z+1,z,z+1));
        zahl(c)=z;
        c=c+1;
   
    end
           
end
%hier geht der letzte Wert verloren
index1=[zahl];


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
    if eval(sprintf(DRZ1(%d)==DRZ1(%d) | Mom1(%d)==Mom1(%d);',z,z+1,z,z+1));
        zahl(c)=z;
        c=c+1;
   
    end
           
end
%hier stehen jetzt alle die, die nicht verwendet werden sollen
index1=[zahl];

DRZ1(alle ausser index1)

 




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.


ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 10:50     Titel:
  Antworten mit Zitat      
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:

Code:

DRZ1=[0 0 1000 2000 2000 3000 3000 3500 4000 4000 5000 4500];
Mom1=[-20 -10 50 100 80 150 200 100 100 100 300 150];

DRZ2=[1000 2000 3000 3500 3000 4500];
Mom2=[50 100 80 150 150 300];

% 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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 12:18     Titel: antwort
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 19.06.2009, 12:38     Titel: antwort
  Antworten mit Zitat      
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.
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 12:58     Titel:
  Antworten mit Zitat      
Willst Du die Werte löschen, die du als doppelt gefunden hast?

Dann musst Du noch folgendes in den Code schreiben:

Code:

DRZ1(index_doppelt) = [];
Mom1(index_doppelt) = [];
 


Gruß, Ben
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 13:12     Titel:
  Antworten mit Zitat      
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.


FEHLER OBEN IM QUELLTEXT:
Code:
vektor1 = (DRZ1+1).*Mom1;
vektor2 = (DRZ2+1).*Mom2;
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 13:38     Titel:
  Antworten mit Zitat      
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:

Code:

DRZ1_neu = DRZ1;
Mom1_neu = Mom1;
DRZ1_neu(index_doppelt) = [];
Mom1_neu(index_doppelt) = [];
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 13:47     Titel:
  Antworten mit Zitat      
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?
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 14:08     Titel:
  Antworten mit Zitat      
Code:

a=1;
for ii = 1:length(vektor1)
    for kk = 1:length(vektor2)
        if vektor2(kk) == vektor1(ii)
            gleicher_betriebspkt(a,:) = [ii kk];
            a=a+1;
        end
    end
end
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 14:46     Titel:
  Antworten mit Zitat      
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:
Code:
   DRZ_gesamt = [DRZ1'; DRZ2']
    Mom_gesamt = [Mom1'; Mom2']
    [hwert_gesD, woft_gesD, gsoft_gesD] = mode(DRZ_gesamt)
    [hwert_gesM, woft_gesM, gsoft_gesM] = mode(Mom_gesamt)


Entweder habe ich es noch icht so richtig verstanden oder irgendwas läuft schief. Wieso bekomme ich für "gsoft_gesM" nicht wie hier:
Code:
[hwert1, woft1, gsoft1] = mode(vektor1);
[hwert2, woft2, gsoft2] = mode(vektor2);


die gesamten Werte die doppelt sind raus?



Werde den code wenn ich halbwegs sicher bin dass es so funktioniert hier hineinstellen.
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 15:06     Titel:
  Antworten mit Zitat      
Fehler von mir! Sorry!!!

Code:

[hwert_gesM, woft_gesM, gsoft_gesM] = mode(Mom_gesamt)
 


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...

Schau mal diesen Beitrag an: Link

Wenn Du den Code anwendest, vielleicht hilft dir das weiter:
Code:

[anzahl, unique_werte] =  hist(vektor1,unique(vektor1))

resneu=[unique_werte', anzahl'];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 15:33     Titel:
  Antworten mit Zitat      
Code:
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]


DRZ1=round(DRZ1/100)*100;
Mom1=round(Mom1/10)*10;

DRZ2=round(DRZ2/100)*100;
Mom2=round(Mom2/10)*10;

%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

INDEX=gleicher_betriebspkt3;
Matrix=[DRZ1([INDEX(:,1)]) Mom1([INDEX(:,1)]) DRZ2([INDEX(:,2)]) Mom2([INDEX(:,2)]) ];

Index1=INDEX(:,1);
Index2=INDEX(:,2);
 


Du hast gerade einen Menschen richtig glücklich gemacht. Irgendwie stand ich da ganz schön auf dem Schlauch. Jetzt scheint es zu funktionieren. DANKE
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 15:39     Titel:
  Antworten mit Zitat      
Freut mich!

Wenn ich mir aber dein code anschaue, dann habe ich nicht wirklich dazu beigetragen! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Jonny

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2009, 16:02     Titel:
  Antworten mit Zitat      
Naja Der Code besteht ja im Grunde nur aus 3 Vorschleifen und die kommen von dir. Smile

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
 



Alternativ habe ich meinen wieder ausgegraben:

Code:
DRZ1=[0     0   0 2000 2000 2000 3000 3000 3500 4000     0 5000 4500 ];
Mom1=[-20 -10  50   100  100   80  150  200  100  100  100  300  150 ];

c=1;
for z =1:length(DRZ1)-1
    if eval(sprintf('DRZ1(%d)==DRZ1(%d) & Mom1(%d)==Mom1(%d);',z,z+1,z,z+1));
        zahl(c)=z;
        c=c+1;
    end
end

%hier stehen jetzt alle die, die nicht verwendet werden sollen
index1=[zahl]

DRZ1_kurz(index1(:))= NaN;
Index1 = find(isnan(DRZ1_kurz)~=1)
 


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.
 
ben
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 21.08.08
Wohnort: Stuttgart
Version: R2007a, R2008b
     Beitrag Verfasst am: 19.06.2009, 16:09     Titel:
  Antworten mit Zitat      
Schau mal nach dem hist-Befehl, den ich vier Einträge oben drüber beschrieben habe. Damit könnte das recht schnell gehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.