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

zeile für zeile und spalte für spalte vergleichen

 

Ristrafil
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2021, 14:36     Titel: zeile für zeile und spalte für spalte vergleichen
  Antworten mit Zitat      
Code:
% Das ist mein Programm.

a = zeros(10,6);

for n = 1:10
    a(n,:) = randi([10 50],1,6);
end

for n = 1:9
    for i = 1:6
        differ(n,i) = abs(a(n,i) - a(n+1:10,i))
    end
end

 


ich möchte die erste zahl aus der ersten zeile mit jeder weiteren ersten zahl aus den anderen zeilen vergleichen. und dann die zahl aus der 1 zeile/2 spalte mit jeder zahl aus allen zeilen aber spalte 2 vergleichen usw...

mein code geht irgendwie nciht.

mfg ristrafil

danke
Private Nachricht senden Benutzer-Profile anzeigen


Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2021, 14:38     Titel:
  Antworten mit Zitat      
und dann analog weiter, die ganze 2 zeile mit allen anderen vergleichen, dann die 3 zeile mit allen anderen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2021, 15:34     Titel:
  Antworten mit Zitat      
Code:
for x =1:9
    for n = 1:9
        for i = 1:6
             differ(n,i) = abs(a(x,i) - a(n+1,i));
        end
    end
end


habs jetzt mal so probiert, aber funktioniert noch nicht ganz
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

für mich ist nicht klar, was das Ergebnis sein soll.
Wenn du einen Wert mit 9 anderen vergleichst, bekommst du nun 9 Ergebnisse. Sollen es wirklich 9 Ergebnisse sein oder willst du die irgendwie weiterverarbeiten (min, max, mean, ...), um für jeden Eintrag ein Ergebnis zu bekommen?

Was wäre z.B. für

24 38 22
44 20 44
18 50 14
33 43 28

das gewünschte Ergebnis? (ich denke, 4 Zeilen und 3 Spalten sind erst mal genug)

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 13:10     Titel:
  Antworten mit Zitat      
Hallo Harald ich benutze mal deine zahlen als beispiel.

wir haben also die matrix
24 38 22
44 20 44
18 50 14
33 43 28

jetzt soll Zeile 1 mit jeder ANDEREN Zeile verglichen werden, sprich subtrahieren.
z.B. 1 zeile - 2 zeile --> 24-44, 38-20, 22-44
1 Zeile - 3 Zeile --> 24-18, 38-50, 22-14
usw.. bis die 1 zeile mit jeder anderen verglichen wurde

wenn die 1 zeile mit allen anderen verglichen wurde, soll anschließend die 2 zeile mit jeder verglichen werden....usw, bis alle Zeilen die ich in meiner matrix habe miteinandern verglichen wurden.

WIESO das ganze??

am ende des programms sollen mir nur die zeilen aus meiner riesen großen matrix angezeigt werden, wo der abstand(subtraktion von vorhin) an jeder stelle nicht größer als 3 ist.

wenn ich z.B. so eine matrix habe 10 25 45
11 34 56
15 35 55

dann soll mir nur die 1 zeile und die 3 zeile angezeigt werden, da sich die 11 in der 2 zeile von der 10 in der 1 zeile nur um 1 unterscheidet.


mfg

ristrafil
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy1989
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 13:57     Titel:
  Antworten mit Zitat      
Vllt hilft eine Schleife

A =
[ 5 4 3;
7 5 3;
9 4 6;
11 1 0];
C = A;

Code:
for i=size(A,1):-1:1
    if ~all(abs(A(1,:)-A(i,:))<3)
         C(i,:) = [];
    end
end


statt all kannst du auch any nutzen, falls du nur einen Wert brauchst der kleiner ist.
C wäre dann die Ersatzmatrix. Geht bestimmt sogar noch schlanker.
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2021, 16:04     Titel:
  Antworten mit Zitat      
Servus Andy,

danke für deine Gedanken/Hilfe,

leider hat der Code von dir nicht mein Problem gelöst. Wenn ich deinen code anwende auf meine matrix(bestehend aus 10 zeilen), bekomme ich 10 ausgaben, wobei mir bei jeder Ausgabe 1 zeile weniger aus meiner matrix angezeigt wird.

sprich. 1 Ausgabe. 10 zeilen aus meiner matrix
2 Ausgabe. 9 zeilen aus meiner matrix
usw.....

die zeilen werden somit gar nicht verglichen

LG

Ristrafil
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.01.2021, 17:03     Titel:
  Antworten mit Zitat      
Hallo nochmal,

Zitat:
usw.. bis die 1 zeile mit jeder anderen verglichen wurde

wenn die 1 zeile mit allen anderen verglichen wurde, soll anschließend die 2 zeile mit jeder verglichen werden....usw, bis alle Zeilen die ich in meiner matrix habe miteinandern verglichen wurden.

Deine "usw" sind genau das Problem.
Ich habe das kleine Beispiel gewählt, weil ich die kompletten Ergebnisse sehen wollte. Wenn dir das bei 4x3 zu viel Arbeit ist, kannst du die Matrix gerne noch etwas verkleinern. Das resultiert meines Erachtens in einer 3D-Matrix oder einem Cell Array und die Frage ist, wie diese gespeichert werden sollen.

Zitat:
wenn ich z.B. so eine matrix habe 10 25 45
11 34 56
15 35 55

dann soll mir nur die 1 zeile und die 3 zeile angezeigt werden, da sich die 11 in der 2 zeile von der 10 in der 1 zeile nur um 1 unterscheidet.

Der Logik kann ich nicht folgen.
Wie lässt sich die Logik, dass zwei Elemente in zwei Zeilen sich wenig unterscheiden und man deswegen eine dritte angezeigt haben möchte auf viele Zeilen verallgemeinern?
In der dritten Spalte sind die Unterschiede zwischen Zeile 1 und 3 doch durchaus groß?

Zitat:
Wenn ich deinen code anwende auf meine matrix(bestehend aus 10 zeilen), bekomme ich 10 ausgaben, wobei mir bei jeder Ausgabe 1 zeile weniger aus meiner matrix angezeigt wird.

Dann poste doch bitte deine Matrix und deinen momentanen Code, damit man das nachvollziehen kann. Andys Code erzeugt nämlich erst mal überhaupt keine Ausgabe im Command Window (sofern du das meinst).

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2021, 13:43     Titel:
  Antworten mit Zitat      
hallo zusammen, ich habe unten mein aktuellen code mit kommentaren was der jeweilige abschnitt machen soll und was noch nicht stimmt. und unter dem code nochmal ein kleines beispiel, welches das problem/ziel klar machen sollte.

vielen dank euch allen


Code:

%Hier erstelle ich mir eine matrix mit 10 zeile und 6 spalten mit zahlen zwischen 10 und 50
a = zeros(10,6);
for n = 1:10
    a(n,:) = randi([10 50],1,6);
end


%Mit dieser schleife habe ich bis jetzt definiert, dass zeile 1 mit zeile 2 verglichen wird, dann zeile 2 mit zeile 3 usw...[b]ABER[/b] ich möchte das jede zeile mit jeder zeile verglichen wird, hier komme ich gerade nciht weiter
for n = 1:9
    for i =1:6
        differ(n,i) = abs(a(n,i) - a(n+1,i));
    end
end

% hier ist dann meine Ausgabe: es sollen mir nur die jenigen zeilen (n) aus der matrix angezeigt bekommen, welche sich an jeder stelle um mindestens 3 unterscheiden verglichen mit der zeile die drüber steht. Mein Ausgabe ist aber falsch, sie funktioniert nicht

for n=1:8
   if differ(n,:) >=3
       SCODE = a(n:n+1,:)
   end
end


hier nochmal ein sehr einfaches beispiel um nochmal das ziel zu erleutern. ich erzeuge eine zufallsmatrix, angenommen sie ist 12 14 16 18
15 17 20 25
15 18 21 30
18 21 25 30

meine Ausgabe soll sein: 12 14 16 18
15 17 20 25
18 21 25 30

Die dritte Zeile aus der matrix soll quasi rausgefiltert werden, da sich sich nicht an jeder stelle um 3 unterscheidet verglichen mit zeile 2!!! Die vierte zeile kann wieder ausgegeben werden, da sich sich an jeder Stelle um mindestens 3 unterscheidet verglichen mit der zweiten Zeile.

ich hoffe ich konnte das Problem nun richtig erläutern.

danke für eure mühe und hilfe

lg

ristrafil
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2021, 15:13     Titel:
  Antworten mit Zitat      
hallo zusammen, hab jetzt herausbekommen, wie ich jede zeile mit jeder zeile vergleichen kann. hab da an den tipp von Harald gedacht, bezogen auf 3D-Matrizen usw...

Code:

for x = 1:9
    for n = 1:9
         for i =1:6
                differ(n,i,x) = abs(a(x,i) - a(n+1,i));
         end
    end
end
 


so funktioniert es bei mir.
jetzt muss ich noch die ausgabe programmieren.

vielen dank für den tipp harald und falls jemand ne idee hat für die ausgabe. thank you

lg ristrafil
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
hier nochmal ein sehr einfaches beispiel um nochmal das ziel zu erleutern. ich erzeuge eine zufallsmatrix, angenommen sie ist 12 14 16 18
15 17 20 25
15 18 21 30
18 21 25 30

meine Ausgabe soll sein: 12 14 16 18
15 17 20 25
18 21 25 30

Die dritte Zeile aus der matrix soll quasi rausgefiltert werden, da sich sich nicht an jeder stelle um 3 unterscheidet verglichen mit zeile 2!!! Die vierte zeile kann wieder ausgegeben werden, da sich sich an jeder Stelle um mindestens 3 unterscheidet verglichen mit der zweiten Zeile.


Wenn das dein Ziel ist, brauchst du aber nur jede Zeile mit der gegenwärtig vorherigen vergleichen:

Code:
M = [12 14 16 18
15 17 20 25
15 18 21 30
18 21 25 30];

k = 2;
count = 2;
while count < size(M,1)
    if ~all( abs(M(k,:) - M(k-1,:)) >= 3 )
        M(k,:) = [];
    else
        k = k + 1;
    end
    count = count + 1;
end
disp(M)


Es kann sein, dass ich nicht jede Eventualität bedacht habe, aber zumindest für den Fall erzeugt es den gewünschten Output.
Wenn das für eine andere Matrix nicht der Fall ist, bitte diese Matrix posten und welcher Output stattdessen erwartet wird.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2021, 14:45     Titel:
  Antworten mit Zitat      
hallo Harald, vielen dank für deinen letzten Beitrag. Mit deinem Beispielcode komme ich fast auf mein Ziel. Ich poste mal meine Matrix und den Output.

Code:

Matrix:
25    46    27    35    23    32
24    43    35    40    38    43
12    32    48    40    35    48
50    29    28    34    40    46
43    48    36    31    22    27
39    11    10    50    28    34
22    50    26    26    22    31
41    19    43    30    47    14
34    45    31    30    35    29
19    35    38    31    32    17

--> 10 Zeilen, 6 spalten zufällig generiert

Hier der Output:
25    46    27    35    23    32
12    32    48    40    35    48
43    48    36    31    22    27
39    11    10    50    28    34
22    50    26    26    22    31
41    19    43    30    47    14
34    45    31    30    35    29
19    35    38    31    32    17

--> 8 Zeilen
 


also die ersten 6 Zeilen des outputs sind richtig, dank deines Algorithmus. Die 7 und 8 Zeile des outputs soll er aber nicht mehr anzeigen, da einmal die 30 über der 30 steht (Zeile 6 und 7) und einmal steht die 30 über der 31 (Zeile 7 und Cool, sprich in beiden fällen kein unterscheid größer gleich 3.

ich konnte dein Code eig. gut nachvollziehen und verstehe eig. nicht wieso der Code ab einer bestimmten Zeile nicht mehr unterscheidet.

Meine Matrix wird immer zufällig generiert. Was konstant bleibt ist die Zeilenzahl=10 und die Spaltenzahl = 6, sowie die vorkommenden zahl zwischen 10 und 50: das liegt am Projekt

vielen dank

ristrafil
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.01.2021, 21:27     Titel:
  Antworten mit Zitat      
Hallo,

solche Fehler kann man am besten finden (und beheben), in dem man das zeilenweise im Debugging-Modus durchgeht. Ich hatte mich da irgendwo gedanklich verheddert. Es geht auch ohne die Variable count und so sogar noch nachvollziehbarer:

Code:
k = 2;
while k <= size(M,1)
    if ~all( abs(M(k,:) - M(k-1,:)) >= 3 )
        M(k,:) = [];
    else
        k = k + 1;
    end
end
disp(M)


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ristrafil
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.12.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2021, 13:50     Titel:
  Antworten mit Zitat      
Omg jetzt klappe es wunderbar.

1000 Dank für die Hilfe

LG
Ristrafil
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.