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

Vektoren vergleichen und Indizes auslesen

 

p.nietnagel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 19.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2010, 23:36     Titel: Vektoren vergleichen und Indizes auslesen
  Antworten mit Zitat      
Hallo,

ich brüte inzwischen seit heut Mittag über einer eigentlich simplen Aufgabe Embarassed und finde die Lösung nicht (ganz).
Ich hab 160 Vektoren á 12 Einträge (Struktur "E") und 5 Vektoren á 32 Einträge (Struktur "T").
Code:

T.p(1,:) = [4   103    82   116   130    18   273    56   157   147    44     4];
T.p(2,:) = [4   142    79    89   125    40   170   164    42   133    69     4];
T.p(3,:) = [4   123    94   102   124   162   192   110   105    83     9     4];

E.h = [167:5:322]';
E.f = [168:5:323]';
E.n = [170:5:325]';
 

Die Zahlen aus den Vektoren "T" (insgesamt = 160) kommen jede genau einmal in einem der "E"-Vektoren vor.
Und ich will wissen, in welchem dieser Vektoren und das will ich mir dann wieder in neue Variablen schreiben.

Ich hab 2 Ansätze gefunden.
Der erste:
Code:

counth = 0;
countf = 0;
countn = 0;

TH = [];
TF = [];
TN = [];

for i = 1 : size(T.p,1)
    for j = 1: length(E.h)
        fh = find(T.p(i,:) == E.h(j));
        if isempty(fh) == 1
            counth = counth + 1;
            TH(counth,:) = i;
            continue
        end
        ff = find(T.p(i,:) == E.f(j));
        if isempty(ff) == 1
            countf = countf + 1;
            TF(countf,:) = i;
            continue
        end
        fn = find(T.p(i,:) == E.n(j));
        if isempty(fn) == 1
            TN(countn,:) = i;
            countn = countn + 1;
            continue
        end
    end
end
 


In TH muesste eine "3" fuer T.p(3) stehen; stattdessen erhalte ich ein '95 x double',
in TF muesste eine "1" fuer T.p(1) stehen; stattdessen erhalte ich ein "3" in TN muesste eine "2" fuer T.p(2) stehen; das wird gar nicht ausgegeben. Shocked

Der zweite Ansatz:
Code:

counth = 0;
countf = 0;
countn = 0;
TH = [];
TF = [];
TN = [];

for i =  1 : size(T.p,1)  
    for j = 1: length(E.h)      
        nColumnh = setdiff(E.h, T.p(i,:));
        if length(nColumnh) < length(E.h) == 1
           counth = counth + 1;
           TH(counth,:) = i;  
           continue
        end
        nColumnf = setdiff(E.f, T.p(i,:));
        if length(nColumnf) < length(E.f) == 1
           countf = countf + 1;
           TF(countf,:) = i;  
           continue
        end        
        nColumnn = setdiff(E.n, T.p(i,:));
        if length(nColumnn) < length(E.n) == 1
           countn = countn + 1;
           TN(countn,:) = i;  
           continue
        end  
    end
end
 


Hier stimmt die eingetragene Zahl, aber warum wird die 32mal in die neuen Vektoren geschrieben? Wo wird der Zähler weiter hochgezählt?
Hab ich das
Code:
falsch verwendet? Meine Idee dahinter war, die weiteren Durchläufe zu sparen, sobald der Eintrag gefunden wurde.
Besonders elegant und kurz ist die Lösung auch nicht. Hat jemand eine Idee, wie ich das verbessern kann?

Ich hatte auch probiert mit isequal(), aber das funktioniert nicht. Gibt es nicht einen einfachen Befehl, mit dem man elementweise die Vektoren vergleichen und sich die Position ausgeben lassen kann?

Vielen Dank im Voraus!

Gruß,
p.nietnagel
Private Nachricht senden Benutzer-Profile anzeigen


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2010, 05:05     Titel:
  Antworten mit Zitat      
Hi.

Ich denke mal duch suchst nach dem Befehl

Code:


Bsp.:

Code:

[match index] = ismember(T.p,E.f);
 


MFG und gute Nacht
 
p.nietnagel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 19.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2010, 10:54     Titel:
  Antworten mit Zitat      
Moin,

vielen Dank!

Code:
[match index] = ismember(T.p,E.f);  


Das ist ja echt kurz, aber ich verstehe nicht ganz, was in
Code:
drinsteht. Dort ist an der Stelle des matches nicht die Zahl angeführt, die dieselbe ist (das wäre in dem Fall 273), sondern eine "22".
Das versteh ich nicht Embarassed

Da ich ja in einem neuen Vektor die Zeilennummer schreiben will, wo überall in T.p (ist ja eigentlich eine Matrix) ein match mit den Vektoren E.h, E.f, E.n gefunden wurde, muss ich wieder eine Schleife bauen, um die matches auszulesen?
Mache ich das am besten mit
Code:


Mich würde trotzdem noch interessieren, was bei meinem zweiten Ansatz schiefgelaufen ist. Weil, so schlecht finde ich den nicht. Der gibt hübsch die gewünschten Zeilennummer aus. Aber warum wird jeder Eintrag 32mal geschrieben? Was hab ich falsch gemacht?

Vielen Dank!!!


Viele Grüße,
p.nietnagel
Private Nachricht senden Benutzer-Profile anzeigen
 
p.nietnagel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 19.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2010, 11:02     Titel: Kommando zurück: Fehler gefunden
  Antworten mit Zitat      
p.nietnagel hat Folgendes geschrieben:

Mich würde trotzdem noch interessieren, was bei meinem zweiten Ansatz schiefgelaufen ist. Weil, so schlecht finde ich den nicht. Der gibt hübsch die gewünschten Zeilennummer aus. Aber warum wird jeder Eintrag 32mal geschrieben? Was hab ich falsch gemacht?


Ich hab den Fehler grad gefunden: die zweite Schleife ist überflüssig.
Code:

Weil hier
Code:
nColumnh = setdiff(E.h, T.p(i,:));

wird ja der gesamte Vektor verglichen und ich hab das 32mal machen lassen.

Manchmal sieht man den Wald vor lauter Bäumen nicht Very Happy

Schöne Grüße,
p.nietnagel
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2010, 14:04     Titel:
  Antworten mit Zitat      
Zu deiner Index Frage: die 22 gibt das Matrixelement in E.f an, wo die Zahl steht, die sowohl in T.p als auch in E.f vorkommt:

Das 22. Element in E.f (E.f(22)) ist also die gesuchte 273.
In T.p ist die selbe Zahl an der Stelle, wo in der 'match'-matrix die 1 steht.
Code:

[row col] = find(T.p == 1);
 

Das Element T.p(row,col) ist also ebenso 273.

Hoffe alle Unklarheiten sind nun beseitigt.

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