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

logische Indizierung mit Vektorenvergleich

 

Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2009, 17:05     Titel: logische Indizierung mit Vektorenvergleich
  Antworten mit Zitat      
Hallo,

es ist ja möglich mit logischer Indizierung Elemente bzw. Zeilen aus einer Matrix zu wählen in der From von
Code:
M(M(:, spalte)==wert, :)

wenn man jetzt sehr viele Werte hat, wird es ja unübersichtlich, ist auch so etwas in der Art wie
Code:
M(M(:, [Spalte1 Spalte2 Spalte3])==Vektor, :)

möglich?

Vielen Dank schon einmal.


Harald
Forum-Meister

Forum-Meister


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

möglich ist das sicher. Im Zweifelsfall ausprobieren.
Die entscheidendere Sache ist, dass du da sehr aufpassen musst, dass du mit deinen Indizes nicht durcheinander kommst.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2009, 17:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

ausprobiert habe ich es schon und es geht eben leider so nicht. Die einzige umständliche Variante, welche mir noch einfiel besteht darin, dass man eine zweite Matrix der gleichen Größe bildet, die jeweils den Zeilenvektor enhält, sie dann von einander subtrahiert und dann die absolute Spaltensumme im Vergleich mit 0 den jeweiligen logsichen Wert ergibt. Sieht dann so aus:
Code:
M(sum(abs(M(:, [Spalte1 Spalte2])'-(Vektor*ones(1,size(M,1)))))'==0, :)

Halt etwas umständlich ....

Mit den Indizes hast Du recht, leider kann man ja wohl für Spaltenindizes keine Namen vergeben, oder? Die einzige Variante die mir einfiel ist in einer Struktur für Spaltennamen den jeweiligen Indize zu hinterlegen.
 
Harald
Forum-Meister

Forum-Meister


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

stimmt, im Nachhinein sieht das etwas merkwürdig aus. Lass mich die Frage modifizieren: was willst du denn erreichen?
So oder so: isequal könnte helfen...

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2009, 20:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

wie ich eingangs schon geschrieben hatte, will ich mir einfach nur Schreibarbeit sparen. In meinem Fall habe ich in einer Matrix mit einem großen Datensatz. Wenn ich z.B. Werte plotte, möchte ich aber nur diejenigen Datensätze nutzen, welche bestimmte Eigenschaften haben, d.h. bei denen mehrere Spalten ganz bestimmte Werte haben. Nun könnte ich zwar schreiben
Code:
M(M(:, Spalte1)==V(Spalte1) & M(:, Spalte2)==V(Spalte2) & ..., [Spaltenauswahl])

schreiben, wobei M meine Matrix mit dem Datensätzen ist und V ein Vektor, der alle Eigenschaften beinhaltet, die erfüllt sein müssen, aber dies ist reichlich mühselig, deshalb würde ich der Eleganz und der Schreibfaulheit halber gerne direkt die entsprechende Spaltenauswahl mit dem Eigenschaftsvektor (Zeilenvektor) verglichen.
 
Harald
Forum-Meister

Forum-Meister


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

ich sehe auf Anhieb keine einfachere Möglichkeit.

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

Forum-Meister


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

wenn du sowas öfter brauchst, lohnt sich vielleicht eine selbst geschriebene Funktion dazu:

Code:
function tf = eqrows(A, B)

if ~isequal(size(A), size(B))
    error('Inputs A and B must be of equal size')
else
    tf = arrayfun(@(I) isequal(A(:,I), B(:,I)), (1:size(A, 1))');
end


Beispiel: >> eqrows(eye(2), [1 1; 0 1])

Das vergleicht jetzt die Zeilen zweier Matrizen. Wenn du die Zeilen mit einer Zahl vergleichen willst, muss man das ganze entsprechend abändern.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2009, 16:01     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die Hinweise zum einen den Vergleich es in einer Funktion zu kapseln und damit die Übersichtlichkeit zu erhöhen, sowie zum anderen auf arrayfun.
Damit es aber ein zeilenweiser Vergleich wird, ist : und I zu vertauschen, also
Code:
tf = arrayfun(@(I) isequal(A(I,:), B(I,:)), (1:size(A, 1))');
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.11.2009, 16:33     Titel:
  Antworten mit Zitat      
Stimmt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
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.