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

Datenauswahl anhand mehrerer Kriterien

 

knarz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2013, 19:12     Titel: Datenauswahl anhand mehrerer Kriterien
  Antworten mit Zitat      
Moin,

ich habe eine Messreihe auf die ich gerne mit Matlab zugreifen möchte. Die einzelnen Messpunkte zeichnen sich durch unterschiedliche Kombinationen vorgegebener Attribute aus. Die eigentlichen Daten sind nicht in der Messmatrix, diese ist mehr eine übersicht.
Ziel ist es den Namen des entsprechenden Messpunktes unter Angabe einzelner Eigenschaften zu finden.

Also ungefähr so:
Es wurden Frequenzgänge von 20 Lautsprechern aufgenommen und unter den Namen speaker01-speaker20 gespeichert.
In der Messmatrix gibt es beispielsweise die Attribute: Name, Durchmesser, Widerstand, Farbe
Diese sind für jeden der Lautsprecher eingetragen.
Nun wär es prima, wenn man sich von allen grünen Lautsprecher mit 10cm Durchmesser den Namen des zugehörigen ausgeben lassen könnte.

Die Anzahl der vorgegebenen Suchkritierien kann variieren, beispielsweise nur rote Lautsprecher.

Bietet sich eine normale Matrix, cell oder struct für die Speicherung dieser Messpunkteübersicht an und wie wird diese/s dann sinnvoll durchsucht?

Ich hoffe das zumindest die Problematik schonmal verständlich ist... Smile


Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 01.04.2013, 19:49     Titel:
  Antworten mit Zitat      
da könnte sich die Objektorientierte Programmierung anbieten, also ein Objekt Lautsprecher und dann ein Array/Cell von Lautsprecher'n. Wie man da sucht, weiss ich allerdings auch nicht.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2013, 20:48     Titel:
  Antworten mit Zitat      
Dafür sind doch structs wie gemacht:
Code:
lautsprecher = struct('farbe', {'rot', 'blau'}, 'durchmesser', {10, 15});
auswahl = strcmp({lautsprecher.farbe},'rot');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
knarz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2013, 00:02     Titel:
  Antworten mit Zitat      
Danke schonmal,

den Eintrag der Matrix in ein struct scheint sinnvoll, da die Felder entsprechend benannt werden können.

Wenn nun nach zwei Feldern gleichzeitig gesucht werden soll, so funktioniert dieses zusammengestückel:
Code:

lautspr = struct('name',{'a','b','c'},'farbe',{'r','b','r'},'durchm', {'10','15','15'});

id0 = strcmp({lautspr.farbe},'r');
id1 = strcmp({lautspr.durchm},'15');

for k=1:length(id0);
    c(k) = (id0(k)==1 && id1(k)==1);  
end
c = logical(c);
lautspr(c).name
 

aber das geht bestimmt auch noch schöner.

Wenn nun eine Großere Anzahl an Feldern durchsucht wird, lässt sich das Prinzip ja erweitern. Wenn nun aber die Anzahl der gesuchten Felder reduziert wird, muss entweder ein suchkriterium ignoriert oder deaktiviert werden:
z.B. ignorieren des Durchmessers: (geht so natürlich nicht...)
Code:

id0 = strcmp({lautspr.farbe},'r');
id1 = strcmp({lautspr.durchm},'*');
 

oder auskommentieren von id1, dadurch gibt es jedoch ein problem in der for-Schleife.
Hat jemand eine Idee?
also ganz grob: Smile
Code:

for k=1:length(id0);
    c(k) = (id0(k)==1 && if exist(id1(k)==1)end && if...  
end
 


merci.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.04.2013, 08:58     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aber das geht bestimmt auch noch schöner.

Ja. Direkt mit logischer Indizierung:
Code:
c = id0 & id1;
{lautspr(c).name}


Zitat:
Wenn nun eine Großere Anzahl an Feldern durchsucht wird, lässt sich das Prinzip ja erweitern. Wenn nun aber die Anzahl der gesuchten Felder reduziert wird, muss entweder ein suchkriterium ignoriert oder deaktiviert werden:

Das könnte etwas umständlich werden. Ist das denn wirklich dynamisch nötig?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
knarz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2013, 11:33     Titel:
  Antworten mit Zitat      
Salü,

die logische Indizierung ist prima.
Die Frage nach der Notwendigkeit ist schwierig, natürlich könnte man auch jedesmal 'von Hand' ablesen. Um ehrlich zu sein lohnt sich der Aufwand wahrscheinlich erst ab dem 50. ablesen...

Mittlerweile tut es was es soll und sieht so aus:
Code:

lautspr = struct('name',{'a','b','c'},'farbe',{'r','b','r'},...
    'durchm', {'10','15','15'},'ohm',{'4','4','8'});

clear sFarbe sDurchm sOhm
% Eingabe der gesuchten Eigenschaften:
sFarbe ='b';
% sDurchm ='10';
sOhm = '4';

% Eintragen der Suchbegriffe
searcher = struct;
if exist ('sFarbe','var')
    searcher.farbe = sFarbe;
end
if exist ('sDurchm','var')
    searcher.durchm = sDurchm;
end
if exist('sOhm','var')
    searcher.ohm = sOhm;
end
% Anzahl der Suchfelder
nfield = fields(searcher);
% initialisieren von id
id = true(1,length(lautspr));

for k=1:length(nfield);
    idi = strcmp({lautspr.(nfield{k})},{searcher.(nfield{k})});
    id = id & idi;
end

lautspr(id).name
 


Durch Auskommentieren der einzelnen Suchvariablen werden diese nicht mehr berücksichtigt.
Verbesserungen natürlich immer wilkommen.
gruß
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2013, 00:01     Titel:
  Antworten mit Zitat      
Hallo knarz,
noch zwei Anmerkungen:
Größen, die Zahlen sind, sollten auch nicht als Strings geschrieben werden müssen:
Code:
ids=[lautsprecher.durchmesser]==searcher.durchmesser;


b) statt den Workspace nach Suchkriterien zu druchsuchen würde ich gleich nur die searcher-Struct füllen.

Was ist fields? Ich hätte an der Stelle fieldnames erwartet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.04.2013, 13:18     Titel:
  Antworten mit Zitat      
Hallo Sirius3,

"fields" ist tatsächlich ein Synonym für "fieldnames". Soweit ich weiß, ist dies aber nicht dokumentiert und ich halte es für ausgesprochen tückisch, weil viele alte Codes das Wort "fields" als Variable benutzen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
knarz

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2013, 10:42     Titel:
  Antworten mit Zitat      
Hi Sirius3;

die Erweiterung der Suchvariablen um Zahlen ist natürlich sinnvoll. Da die aber nicht mit strcmp verarbeitet werden können, habe ich Schleife nochmal aufgeteilt:
Code:

for k=1:length(nfield);
    if ischar(searcher.(nfield{k}));
        idi = strcmp({lautspr.(nfield{k})},{searcher.(nfield{k})}); % für strings
    else
        idi = [lautspr.(nfield{k})]==searcher.(nfield{k}); % für Zahlen
    end
    id = id & idi;
end
 


b) macht Sinn, denn können die exist-Abfragen entfallen.
Der fields Befehl war eher unbewusst, aber hat funktioniert - deswegen ist es mit garnicht aufgefallen.

danke nochmal
gruß knarz
 
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.