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

Matrizen vergleichen und ähnliche Einträge finden

 

clarke
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2013, 15:04     Titel: Matrizen vergleichen und ähnliche Einträge finden
  Antworten mit Zitat      
Hallo,

ich komme aktuell mit meiner Programmierung nicht voran. Ich habe zwei Matrizen mit Messwerten, aus der ich nun eine Matrix machen möchte mit gemeinsamen Einträgen.
Hier sind die Matrizen einmal beispielhaft (als Integer) gezeigt:
Matrix1:
Zitat:
3 202 102 6 0


Matrix2:
Zitat:
42 341 102 6 0


Sobald sich der jeweils vierte Wert in den beiden Matrizen voneinander um weniger als 0.05 unterschiedet, sollen die beiden Zeilen von Matrix 1&2 in Matrix 3 geschrieben werden.

Also bei dem Beispiel oben:
Zitat:
3 202 102 6 0 42 341 102 6 0


Es kann jedoch sein (und daran scheitere ich momentan), dass mehrere Zeilen aus Matrix 1 mit der einen Zeile aus Matrix 2 übereinstimmen (und andersrum genauso). In diesem Fall sollte einfach nur die erste Zeile, bei der das Kriterium erfüllt wird in Matrix3 geschrieben werden und die anderen können vernachlässisgt werden.

Meine bisherigen Versuche verlaufen alle im Sand, die sind entweder falsch oder/und mit zu hohem Rechenaufwand.

Besten Dank im Voraus für die Mühe,
clarke.
Private Nachricht senden Benutzer-Profile anzeigen


jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2013, 15:10     Titel:
  Antworten mit Zitat      
post mal ein bischen mehr matrix.
am besten gefällt mir wenn:
matrix1 =
matrix2 =

matrix3 soll sein:

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2013, 15:19     Titel:
  Antworten mit Zitat      
Matrix 1:
Zitat:
3.45144887941584 201.851498703607 102.131749040279 6.0931674329101 0
3.60178979825667 201.897841418435 102.135935070966 6.08116729959957 0
3.69845729554825 202.058117119574 102.147703677893 6.05116696632325 0
3.75502736751704 202.210153217457 102.153656668351 6.02316665526534 0
3.9494042695215 202.363195668818 102.166361843477 5.99316632198902 0
4.054724771 202.528550541446 102.176849047245 5.96116596649427 0
4.14929777985046 202.695180170093 102.188914995678 5.93316565543636 0
4.30507853921131 202.852024396048 102.194147324303 5.90216531105082 0
4.4107598904232 203.01892527329 102.208034679938 5.8721649777745 0
4.49549758879305 203.188714731091 102.21863632304 5.84116463338896 0



Matrix 2:
Zitat:
42.4937483502106 341.081880361073 102.377046097035 5.47716058963619 0
42.6513920630301 340.902725317126 102.390652743217 5.44816026746908 0
42.7040535453384 340.626770828157 102.40422405169 5.4041597786638 0
42.8433723316517 340.401502494187 102.426399100375 5.37215942316905 0
42.9429717843424 340.262485384959 102.434628470232 5.35215920098483 0
43.1080032694053 340.096312704494 102.448101907349 5.32715892325456 0
43.2006759672025 339.843212568057 102.466370828985 5.28915850110455 0
43.2958791288866 339.592638020058 102.482963005124 5.25415811228217 0
43.4497250932606 339.407924666962 102.495098418957 5.2291578345519 0
43.5021928087041 339.240548219879 102.506969236049 5.20515756793083 0


Angenommen die Differenz soll jetzt max. 0.5 sein, wäre zB Matrix1(6,4) - Matrix2(1,4) = 0.484005376858073 und somit das Kriterium erfüllt.

In Matrix 3 kommt dann:
Zitat:
4.054724771 202.528550541446 102.176849047245 5.96116596649427 0 42.4937483502106 341.081880361073 102.377046097035 5.47716058963619 0

Also die Einträge aus M1(6,: ) und M2(1,: ) aneinandergereiht.

UND: hier wäre jetzt auch für die Einträge Matrix1(7:10,4) - Matrix2(1,4) die Bedingung erfüllt, diese Einträge sollen aber NICHT mit übernommen werden.

Ich hoffe, dass ich mich verständlich ausgedrückt habe Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 27.11.2013, 09:34     Titel: Lösungsversuch
  Antworten mit Zitat      
Wenn ich die Fragestellung richtig verstanden habe, müsste es mit folgendem Code funktionieren:

Code:

differenz=matrix2(:,4)*ones(1,size(matrix1,1)) - ones(size(matrix2,1),1)*matrix1(:,4)';
treffer=find(abs(differenz(:))<0.5,1);
[zeile2 zeile1] = ind2sub(size(differenz),treffer);
matrix3 = [matrix1(zeile1,:),matrix2(zeile2,:)];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 09:40     Titel:
  Antworten mit Zitat      
Hi, danke für den Vorschlag. Er scheint jedoch noch nicht richtig zu funktionieren - Matrix3 hat lediglich 2 Einträge, was nicht realistisch ist.

- Der Befehl "treffer" ergibt mir als Ergebnis "240" zurück, sollte dort nicht ein Vektor rauskommen, der mir alle Zeilen nennt, in denen das Kriterium erfüllt wird?

- In der Matrix3 sind zwar die Werte aus M1 und M2 aneinandergehängt in einer Zeile, aber
Zitat:
matrix3(1,4) - matrix3(1,9) = 0.677007520935772


Sprich, in der Zeile, wo sich die Werte um max. 0.5 unterscheiden sollen, ist die Differenz 0.67.
Private Nachricht senden Benutzer-Profile anzeigen
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 27.11.2013, 09:59     Titel:
  Antworten mit Zitat      
Eigenartig, mit den von dir geposteten Matrizen ergibt der Code bei mir:

abs(differenz)<0.5

ans =

0 0 0 0 0 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

>> matrix3 =

4.0547 202.5286 102.1768 5.9612 0 42.4937 341.0819 102.3770 5.4772 0

matrix3(1,4) - matrix3(1,9) = 0.4840
treffer = 51

Das zweite Argument von find sorgt dafür, dass nur der erste gefundene Eintrag übernommen wird. Du kannst die die Zeilen übrigens auch direkt von find geben lassen:
Code:

[zeile2,zeile1]=find(abs(differenz)<0.5,1);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 27.11.2013, 12:39     Titel:
  Antworten mit Zitat      
Hallo clarke,

bitte immer zuerst an einem kleinem lauffähigen Beispiel ausprobieren,
damit wir und du die gleichen Daten zur Verfügung haben, sonst kann man ja keine Fehler feststellen.

basieren auf dem Vorschlag reichkrystofski, wäre das lauffähige Beispiel
dies:

Code:

M1=[3.45144887941584 201.851498703607 102.131749040279 6.0931674329101 0
3.60178979825667 201.897841418435 102.135935070966 6.08116729959957 0
3.69845729554825 202.058117119574 102.147703677893 6.05116696632325 0
3.75502736751704 202.210153217457 102.153656668351 6.02316665526534 0
3.9494042695215 202.363195668818 102.166361843477 5.99316632198902 0
4.054724771 202.528550541446 102.176849047245 5.96116596649427 0
4.14929777985046 202.695180170093 102.188914995678 5.93316565543636 0
4.30507853921131 202.852024396048 102.194147324303 5.90216531105082 0
4.4107598904232 203.01892527329 102.208034679938 5.8721649777745 0
4.49549758879305 203.188714731091 102.21863632304 5.84116463338896 0]


M2 =[42.4937483502106 341.081880361073 102.377046097035 5.47716058963619 0
42.6513920630301 340.902725317126 102.390652743217 5.44816026746908 0
42.7040535453384 340.626770828157 102.40422405169 5.4041597786638 0
42.8433723316517 340.401502494187 102.426399100375 5.37215942316905 0
42.9429717843424 340.262485384959 102.434628470232 5.35215920098483 0
43.1080032694053 340.096312704494 102.448101907349 5.32715892325456 0
43.2006759672025 339.843212568057 102.466370828985 5.28915850110455 0
43.2958791288866 339.592638020058 102.482963005124 5.25415811228217 0
43.4497250932606 339.407924666962 102.495098418957 5.2291578345519 0
43.5021928087041 339.240548219879 102.506969236049 5.20515756793083 0]

[m1,m2]  = meshgrid(M1(:,4), M2(:,4));

difference = m1-m2 < 0.5;
difference = [difference; zeros(1,size(difference,2))]

difference  = diff(difference);
[zeile2, zeile1] = find(difference ==-1)
M3 = [M1(zeile1,:), M2(zeile2,:)]


M3(:,4) - M3(:,9)


 
Private Nachricht senden Benutzer-Profile anzeigen
 
reichkrystofski
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 26.11.13
Wohnort: Biederitz
Version: 2006b 32bit, 2009b 64bit
     Beitrag Verfasst am: 27.11.2013, 13:39     Titel:
  Antworten mit Zitat      
Dann soll also doch über die Zeilen von M2 iteriert werden? Das war mir aus der Problemstellung nicht ganz klar.
Die Lösung von denny führt allerdings dazu, dass eine Zeile von m2 zwei Lösungen findet.
Hier nochmal ein Lösungsvorschlag für Iteration über M2, ohne doppelte Zeilenvorkommen/Matrix:

Code:

matrix1 =[
    3.4514  201.8515  102.1317    6.0932         0
    3.6018  201.8978  102.1359    6.0812         0
    3.6985  202.0581  102.1477    6.0512         0
    3.7550  202.2102  102.1537    6.0232         0
    3.9494  202.3632  102.1664    5.9932         0
    4.0547  202.5286  102.1768    5.9612         0
    4.1493  202.6952  102.1889    5.9332         0
    4.3051  202.8520  102.1941    5.9022         0
    4.4108  203.0189  102.2080    5.8722         0
    4.4955  203.1887  102.2186    5.8412         0];
matrix2 =[
   42.4937  341.0819  102.3770    5.4772         0
   42.6514  340.9027  102.3907    5.4482         0
   42.7041  340.6268  102.4042    5.4042         0
   42.8434  340.4015  102.4264    5.3722         0
   42.9430  340.2625  102.4346    5.3522         0
   43.1080  340.0963  102.4481    5.3272         0
   43.2007  339.8432  102.4664    5.2892         0
   43.2959  339.5926  102.4830    5.2542         0
   43.4497  339.4079  102.4951    5.2292         0
   43.5022  339.2405  102.5070    5.2052         0];

differenz=matrix2(:,4)*ones(1,size(matrix1,1)) - ones(size(matrix2,1),1)*matrix1(:,4)';
[dummy,treffer]=max([zeros(size(differenz,1),1),abs(differenz)<0.5],[],2);
treffer = treffer-1;
zeile2=find(treffer>0);
zeile1=treffer(zeile2);
[zeile1,idx]=unique(zeile1); %doppelte vorkommen entfernen
zeile2=zeile2(idx);
matrix3 = [matrix1(zeile1,:),matrix2(zeile2,:)];
matrix3(:,4) - matrix3(:,9)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 15:56     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo clarke,

bitte immer zuerst an einem kleinem lauffähigen Beispiel ausprobieren,
damit wir und du die gleichen Daten zur Verfügung haben, sonst kann man ja keine Fehler feststellen.


Stimmt, ist logisch.
Mit der Programmierung von reichkrystofski bekomme ich bei dem Beispieldatensatz in der Tat die gleichen Ergebnisse, die er gepostet hat.


reichkrystofksi hat Folgendes geschrieben:
Die Lösung von denny führt allerdings dazu, dass eine Zeile von m2 zwei Lösungen findet.


Korrekt. M3(3,6:10) = M3(4,6:10).

Die 2. Lösung von reichkrystofski (von 12:39 Uhr) führt zu einer Matrix 4x10, wo genau der doppelte Eintrag von Denny nicht vorhanden ist.

Wenn ich diese Matrix für meinen kompletten Datensatz verwende (M1=328; M2=243 Einträge), dann komme ich auf 70 erfolgreiche Zuteilungen, was plausibel erscheint.

Ich kann denke ich auf jeden Fall erstmal damit arbeiten, vielen Dank euch beiden!
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.