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

zwei Matrizen vergleichen & ausgeben

 

Der Suchende

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2013, 22:32     Titel: zwei Matrizen vergleichen & ausgeben
  Antworten mit Zitat      
Hallo Leute,

ich habe ein relativ einfaches Problem, aber möchte es gerne optimal lösen. Mittels jeder Menge if und fo schleifen wäre es auch möglich, aber das ist nicht mein Ziel - weil die Datenmenge schnell relativ groß wird.

Ich habe zwei Matrizen eine 3x1 (A) und eine 4x2 (B). Wie kann ich folgende Befehl erstellen? Sollen die Werte von A mit denen der ersten Spalte aus B verglichen werden. Und wenn Sie übereinstimmen, dann soll der Wert der zweiten Spalte von B auf C übergeben werden. Aktuell habe ich es mir folgendermaßen gedacht. Aber "find" ist nicht so der richtige Befehl...

Code:

A = [2; 4; 1];
B = [1 0;2 5;3 10;4 15];
C = 0;
t = 0;

for t = 1:length(A);
    A(t) = find(B(:,1));
    C(t) = B(:,2);
end;
 


Das Ergbnis von C soll übrigens:
C=[ 5; 15; 0] sein.

Ich hoffe ihr könnt mir kurzfristig weiterhelfen.

Vielen Dank im Voraus!
Der Suchende


Hecki
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2013, 14:50     Titel:
  Antworten mit Zitat      
Vielleicht sowas?
Code:
if isequal(A, B(:,1))==1 C=B(:,2) end
Private Nachricht senden Benutzer-Profile anzeigen
 
Der Suchende

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2013, 16:41     Titel:
  Antworten mit Zitat      
Ich habe es jetzt so eingepflegt, aber für C gibt er mir noch keine richtigen Werte aus. Heißt C=0

Code:


A = [2; 4; 1];
B = [1 0;2 5;3 10;4 15];
C = 0;
t = 0;

for t=1:length(A);
    if isequal(A(t), B(:,1))==1;
    C=B(:,2);
    end;
end;

 


Wie könnte man es noch machen?
 
Hecki als Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2013, 16:54     Titel:
  Antworten mit Zitat      
Du brauchst die for Schleife doch gar nicht. Der Code oben löst dein Problem doch schon.
Code:

A = [2; 4; 1];
B = [1 0;2 5;3 10;4 15];
if isequal(A, B(:,1))==1
C=B(:,2)
else
C=NaN;
end
 
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.11.2013, 17:41     Titel:
  Antworten mit Zitat      
Hallo

Nach deinem Beispiel wäre z.B folgendes möglich
Zitat:

C = B(A, 2)


Es nicht klar, ob in A doppelte Einträge vorkommen? sind das Indizien zu B? Ist B immer sortiert?

weitere Möglichkeiten
Code:

[~,l,r] = intersect(A,B(:,1))

C = B(r,2)
C = C(l(l))

 



Code:


[sA, idx] = sort(A)
matches = ismember(B(:, 1), sA)
C       = B(matches, 2)
C       = C(idx(idx))

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Der Suchende

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2013, 18:14     Titel:
  Antworten mit Zitat      
Hallo,

danke erstmal für eure Antworten. Aber der Reihe nach.

@ Hecki

Wenn ich deinen Code nehme, gibt er mir für C nun NaN aus. Ich weiß nicht ob das Problem daran liegt, dass er es nicht bis zum ende durchläuft oder an was sonst.

@ denny

In A können durchaus gleiche Einträge vorkommen. Heißt A könnte auch
Code:

A = [2; 4; 1; 2; 4; 1; 2; 3; 1; ; 2];
 

sein.

B hingegen ist immer sortiert.

Ich habe mich jetzt mal für folgende Variante entschieden:

Code:

clc;
clear all;

A = [2; 4; 1;];
B = [1 0;2 5;3 10;4 15];
C = 0;


[sA, idx] = sort(A);
matches = ismember(B(:, 1), sA);
C       = B(matches, 2);
C       = C(idx(idx));

 


Soweit so gut.

Wenn ich die Matrix A jetzt beliebig vergrößere, was ich im weiteren Verlauf vorhabe:

Code:

clc;
clear all;

A = [2; 4; 1; 2; 2; 4; 1; 3; 3;];
B = [1 0;2 5;3 10;4 15];
C = 0;


[sA, idx] = sort(A);
matches = ismember(B(:, 1), sA);
C       = B(matches, 2);
C       = C(idx(idx));

 


Gibt er mir den Fehler:

Code:


Index exceeds matrix dimensions.

Error in Test (line 12)
C       = C(idx(idx));

 


Deshalb 2 Fragen:

1. Wie bekomme ich dieses Problem gelöst?
2. Was macht sortiert er in [idx]?

Grüße und danke im Voraus
Der Suchende
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.11.2013, 20:13     Titel:
  Antworten mit Zitat      
Hallo

besser statt SORT ist UNIQUE in dem Fall

Code:


A = [2; 4; 1; 2; 2; 4; 1; 3; 3;];
B = [1 0;2 5;3 10;4 15];


[sA, sb ,idx] = unique(A);
matches      = ismember(B(:, 1), sA);
C                = B(matches, 2);
C                = C(idx);

 
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.