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

Matritzenzeilen löschen mit Bedingungen

 

Luc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2017, 01:38     Titel: Matritzenzeilen löschen mit Bedingungen
  Antworten mit Zitat      
Hallo @ all

ich haben zwei Matritzen A(3,n) , B(3,m), n>m
nun möchte falls die Differenzen zwischen den Zahlen in der zweiten Spalte einen bestimmen Wert überschreiten die gesamte Zeile aus Matrix A löschen..

Ziel soll damit sein durch die Überschreitung eines bestimmten Wertes n=m wird.

Ein Codefetzen wäre sehr hilfreich... um diese späte Stunde komme ich grad nicht weiter Wink

danke
--L


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.02.2017, 09:29     Titel:
  Antworten mit Zitat      
Hallo,

mir ist noch nicht klar, welche Zeilen mit welchen verglichen werden sollen.
Ein Beispiel mit 10-15 Zeilen und dem gewünschten Ergebnis wäre hilfreich.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2017, 12:26     Titel: Erklärung an einem Beispiel
  Antworten mit Zitat      
danke für die schnelle Reaktion Harald

Matrix A:

74.0000 26.5274 3595.5649
149.0000 28.1655 202.5660
139.0000 29.7155 782.7971
129.0000 57.2100 2464.2102
213.0000 74.5962 3354.6104
187.0000 76.8405 2070.5054
75.0000 83.0784 2028.2046
70.0000 96.2636 1852.9463
78.0000 97.2153 3671.2288
182.0000 126.5131 3526.7069
11.0000 139.5231 801.0530
29.0000 141.0788 3637.3364
188.0000 143.3719 1782.3344
65.0000 143.8135 1608.2581
193.0000 144.8720 690.6098
94.0000 155.6271 2499.2109
107.0000 158.1493 3354.0513
179.0000 189.8283 4067.2651
142.0000 206.1446 2.4229
194.0000 227.0662 614.7463
49.0000 240.1483 176.3325
...
...
----
Matrix B
175.0000 26.4188 3595.7029
9.0000 28.1741 202.5718
58.0000 29.7294 782.8103
131.0000 57.1996 2464.1990
187.0000 74.6042 3354.6143
128.0000 76.8462 2070.5017
117.0000 83.0709 2028.1956
94.0000 96.2688 1852.9478
200.0000 97.2045 3671.2107
209.0000 126.5149 3526.7288
56.0000 139.5273 801.0460
171.0000 141.0746 3637.3359
107.0000 143.3603 1782.3308
83.0000 143.8168 1608.2426
49.0000 144.8762 690.6141
143.0000 155.6253 2499.2002
185.0000 158.1440 3354.0422
192.0000 189.8346 4067.2368
16.0000 206.1611 2.5596
44.0000 227.0550 614.7570
8.0000 240.2244 176.3736
...
...
Ich habe jetzt random einen Brocken des Anfangs der Matritzen kopiert.

Die Matritx A ist allerding etwas "länger" als die Matrix B.
ich möchte nun jewals Spalte zwei voneinander abziehen.
Quasi:

abs(26.5274 - 26.4188)
abs(28.1655 - 28.1741)
abs(29.7155 - 29.7294)

Falls der Betrag der Differenz zwischen diesen Werten größer 1 wird soll die ganze Zeile des entsprechenden Wertes aus der Matrix A gelöscht werden und der nachfolgende Wert geprüft werden (also geprüft werden ob die Differenz des Betrages größer 1 oder nicht)

Im Ziel wird sich eine kleinere A Matrix ergeben.
In dem gegebenen Zahlenbeispiel oben wird keine Zeile rausfallen da der Abstand immer kleiner 1 ist.

Ich hoffe ich konnte mein nicht ganz einfach zu erklärbares Problem erläutern.

Grüße
--Lucas
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.02.2017, 13:03     Titel:
  Antworten mit Zitat      
Hallo,

wie groß werden denn m und n?

Hier ein Vorschlag, der sogar den Schwellwert anpasst:
Code:
dists = abs(A(:,2)' - B(:,2)); % verwendet implicit expansion von R2016b, ansonsten bsxfun verwenden.
minDist = min(dists);
[~, idx] = sort(minDist);
Anew = A(idx(1:size(B,1)), :);


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2017, 16:12     Titel: es wird wärmer..
  Antworten mit Zitat      
es wird wärmer.. ich kann deinen Code nur leider noch nicht ganz nachvollziehen..

wenn ich ihn einbinde läuft er durch und liefert auch ein Ergebnis..allerdings nicht das gewünschte.

Ich würde dir mal im Anhang die Matritzen als .list-Datei senden, vielleicht wird mein Anliegen so noch etwas klarer..

Matrix B muss sich berkürzen weil manche Abstanden zwischen den x größer 1 sind und damit Fehlmessungen in den Daten.. die dazu gehörigen Daten stehen sicher im eintrag darüber oder darunter in der Matrix.

Ich mach es jetzt mal an einem ganz konkreten Beispiel fest:

Auf Zeile 98 in Matrix A steht in der zweiten Spalte (x-Koord) 1520.2953 und in Spalte 3 (y-Koord) 2752.0837.
In Matrix B steht auf Zeile 98 in der x-Koord. 1520.8914, in der y-Koord 905.7015

Wenn man jetzt auf Zeile 99 in Matrix A schaut ist der y-Wert 905.6912, also passt y von Zeile 99 in Matrix A viel besser zu Zeile 98 von Matrix B.
--> somit muss soll Zeile 98 in A gelöscht werden.

In einem weiteren Kommentar findest du die andere Matrix.. irgendwie lässt sich nur eine Datei anhängen..?!

schonmal vielen Dank Smile

--Lucas

Matrix_A.txt
 Beschreibung:
Matrix A

Download
 Dateiname:  Matrix_A.txt
 Dateigröße:  8.54 KB
 Heruntergeladen:  296 mal
 
Luc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.02.2017, 16:12     Titel: hier noch Matrix B
  Antworten mit Zitat      
--L

Matrix_B.txt
 Beschreibung:

Download
 Dateiname:  Matrix_B.txt
 Dateigröße:  8.31 KB
 Heruntergeladen:  257 mal
 
Harald
Forum-Meister

Forum-Meister


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

du meintest anfangs, dass du Zeilen mit "großer" Differenz in der zweiten Spalte löschen möchtest. Die Beschreibung klingt jetzt aber eher nach der dritten Spalte?

Hier nochmal kommentiert und mit kleiner Variation:
Code:
% Erstelle Tabelle mit Unterschieden der zweiten Spalten
dists = abs(A(:,2)' - B(:,2));
% Bestimme für jede Zeile von A den minimalen Unterschied in den zweiten
% Spalten zu einer Zeile in B
minDist = min(dists);
% Sortiere die Zeilen danach aufsteigend
[~, idx] = sort(minDist);
% Behalte nur die ersten m Zeilen.
% Abweichend vom ersten Vorschlag werden die Indizes sortiert, damit diese
% Zeilen in der ursprünglichen Reihenfolge sind.
Anew = A(sort(idx(1:size(B,1))), :);


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2017, 12:30     Titel: läuft
  Antworten mit Zitat      
Also mit dem Code bekomme ich das gewünschte Ergebniss: Dafür erstmal riesen Dank! Smile

Aber trotzdem möchte ich deine Frage noch beantworten:

Es kann sowohl der x-Wert (Spalte 2), aber auch der y-Wert (Spalte 3) ausschlaggebend sein.
An meinem Beispiel war es zum Beispiel der y-Wert der gezeigt hat das diese Punkte (offensichtlich) nicht zusammenpassen, an einer anderen Stelle könnten zum Beispiel die y-Werte auf der gleichen Zeile den minimalsten Abstand haben, aber x-Wert könnte wiederum eine sehr große Differenz aufweisen.
(Wie du vielleicht merkst fällt es mir schwer alles zu bebschreiben.. :/)
Es ist also "wichtig" das sowohl der x-Wert eine kleine Differenz hat, als auch die y-Wert.

Viele Grüße
--Lucas
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.02.2017, 18:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Es ist also "wichtig" das sowohl der x-Wert eine kleine Differenz hat, als auch die y-Wert.

Dann nimm doch den (quadrierten) Abstand zwischen den Punkten?
Code:
dists =  (A(:,2)' - B(:,2)).^2 + (A(:,3)' - B(:,3)).^2;


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2017, 15:34     Titel: idx
  Antworten mit Zitat      
Hallo Harald,

also es funktioniert jetzt grandios, ich danke dir vielmals! Smile

Allerding möchte ich deine Erfahrung gleich mal ein wenig missbrauchen und dich fragen was der Ausdruck idx bedeutet und macht? und weiterhin was die "~" in Matlab bewirkt?

Ich würde mich freuen wenn du mir das in einfachen Worten für einen Matlabanfänger erklären könntest?

Ich habe schon versucht dies aus englischsprachigen Foren zu verstehen, aber irgendwie wird mir das nicht ganz klar.

Schönes Wochenende
--Lucas
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.02.2017, 18:07     Titel:
  Antworten mit Zitat      
Hallo,

idx (für Index) ist ein Variablenname. Die Funktion sort wird mit zwei Rückgabeargumenten aufgerufen. Die ~ bedeutet, dass das erste Argument übersprungen werden soll.

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