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

gehäuftes Auftreten von Zahlenkombinationen in Matrix

 

p.nietnagel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 19.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2011, 12:23     Titel: gehäuftes Auftreten von Zahlenkombinationen in Matrix
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine mehrere Tausend Zeilen große Matrix und möchte herausfinden, 1.) welche Zahlen besonders häufig vorkommen (das habe ich hingekriegt) und 2.) ob es bestimmte Zahlen gibt, die gemeinsam häufig in einer Zeile auftreten (da komme ich nicht weiter).

Hier mal, wie weit ich bisher bin:
Code:

% Auszug aus der Originalmatrix:
MyMatrix = [ 9    16    44     7    38    49
    33    34    32    19    40    49
     4    42    30    33    10    13
    11    36    19    12    21    49
     7    19     9    10    43    45
    13    21    48    17    10    46
    33    17    23    42    40    37
    36    37     6     3    49    38
    26    29    39    49    36     2
    18    15    17    24    44    31
    43    23     7    20    13    17
    42    37    40    33    17    23];

% Welche Zahlen kommen in der Matrix vor?
Vorkommen = unique(MyMatrix);

% Auflisten (in cell array schreiben), welche Zahl wie oft vorkommt.
% Achtung: da Zahlen (11 insgesamt) zwischen der kleinsten und der größten fehlen, kann
% man nicht mit length(Vorkommen) arbeiten!
for iZahl = 1:max(Vorkommen)
    if ~isempty(find(MyMatrix == iZahl))
        eval(['ind.zahl' sprintf('%2.2d',iZahl) ' = find(MyMatrix(:,:) == iZahl)']);
    end
end

% aus dem cell array extrahieren, wie oft jede Zahl vorkommt.
ind_names = fields(ind);
countzahl = 0;
for iFields = 1:length(ind_names)
        countzahl = countzahl + 1;
        zahl(countzahl,:) = length(ind.(char(ind_names(iFields))));
end
% Und jetzt ausgeben, in welcher Reihenfolge die Zahlen am häufigsten
% vorkommen:
zahl = [Vorkommen,zahl];
zahl_sort = flipud(sortrows(zahl,2))

% Hier werden die Indices der Zahlen geschrieben. Ich dachte, das würde
% beim nächsten Schritt helfen: die Häufigkeit bestimmter
% Zahlenkombinationen, i.e. Auftreten bestimmter Zahlen in einer Zeile,
% erleichtern. Macht das Sinn?
for iZeile = 1:size(MyMatrix,1)
    ZeileIdx(iZeile,:) = [iZeile,iZeile+size(MyMatrix,1),iZeile+size(MyMatrix,1)*2,iZeile+size(MyMatrix,1)*3,iZeile+size(MyMatrix,1)*4,iZeile+size(MyMatrix,1)*5];
end

% Der nächste Schritt fehlt.....
 


Meine Idee war, irgendwie über die Indices (den Abstand zwischen den Indices) darauf zu kommen, welche Zahlen gemeinsam mehrfach in einer Zeile auftreten (die Reihenfolge des Auftretens der Zahlen innerhalb einer Zeile ist egal!) oder ob es gar komplette Zeilen gibt, die wiederholt auftreten (auch hierbei ist egal, in welcher Reihenfolge diese Zahlen dann in der Zeile angeordnet sind).

Hat jemand einen Tipp?


Vielen Dank im Voraus!

Schöne Grüße,
p.nietnagel
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.10.2011, 13:45     Titel: Re: gehäuftes Auftreten von Zahlenkombinationen in Matrix
  Antworten mit Zitat      
Hallo p.nietnagel,

EVAL verkompliziert Dein Programm unnötig. Dazu habeich in diesem Forum aber schon einige (etwa 500?) Antworten verfasst, sodass Du bei Bedarf danach suchen kannst.

Um herauszufinden, welche Zahlen häufig vorkommen, eignet sich HISTC:
[code][N, BIN] = histc(MyMatrix(:), unique(MyMatrix(:));[code]

Zitat:
2.) ob es bestimmte Zahlen gibt, die gemeinsam häufig in einer Zeile auftreten

Was heißt das genau? "Häufig" ist zu schwammig, um es in ein Programm umsetzen zu können.
Der Hilfe-Text des MODE Befehls enthält ein Beispiel zu "To find the mode of a continuous variable grouped into bin".

UNIQUE(MyMatrix, 'rows') könnte auch hilfreich sein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
p.nietnagel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 19.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.10.2011, 14:16     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für Deine schnelle Antwort!
Zitat:
EVAL verkompliziert Dein Programm unnötig. Dazu habeich in diesem Forum aber schon einige (etwa 500?) Antworten verfasst, sodass Du bei Bedarf danach suchen kannst.

Oh Embarassed
Mir hat EVAL bei anderen Aufgaben schon viele gute Dienste geleistet.
Aber Du hast recht, besonders elegant und unkompliziert ist mein Script nicht. Confused

Zitat:
Was heißt das genau? "Häufig" ist zu schwammig, um es in ein Programm umsetzen zu können.

Das stimmt. Sorry. Ich würde gern wissen, ob es Zahlen gibt, die gemeinsam mehr als einmal zusammen in einer Zeile auftreten (wird sicher bei mehreren Tausend Zeilen der Matrix so sein.). Ich hatte mir da ein Ergebnis vorgestellt, wie hier
Code:
zahl_sort = flipud(sortrows(zahl,2))
 

rauskommt: ein Angabe, wie häufig z.B. "8" und "13" oder "8" und "13" und "29" zusammen in einer Zeile auftreten.

Den MODE Befehl verstehe ich nicht ganz Embarassed

Danke und schöne Grüße,
p.nietnagel
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.10.2011, 16:11     Titel:
  Antworten mit Zitat      
Hallo p.nietnagel,

MODE bestimmt das Element, das am häufigsten in einem Vektor vorkommt. Für eine Matrix wird dies auf die Spalten angewendet.
HISTC ist wohl hilfreicher.

Man kann tatsächlich viele Dinge auch mit EVAL lösen. Leider ist es aber anfällig für Bugs und erschwert das Debuggen. Zudem schreibt es während der Laufzeit in die Variablen-Tabelle, so dass Matlab's JIT-Acceleration massiv behindert wird.

Ich habe in den letzten Jahren in verschiedenen Foren natürlich hauptsächlich die Programme mit EVAL gesehen, die Probleme verursacht haben - ansionsten postet man sie ja nicht. Darunter waren nur zwei Arten von Aufgaben, für die EVAL nützlich war:

1. Das Benutzen einer GLOBAL oder PERSISTENT Variablen, deren Namen erst zur Laufzeit bekannt ist. "global(Name)" geht nämlich nicht, man benötigt wirklich "eval(['global ', Name])". Das läßt sich aber leicht umgehen, indem man einen Struct als globale Variable verwendet, deren Fieldname dann der Name der Variablen ist.

2. Wenn ein String mit typischer Matlab-Formattierung in ein numerisches Array umgewandelt werden soll, z.B. '[1:5, 8:12]' oder 'sin(0.4)'. Dies wird z.B. in STR2NUM angewendet. Das manuell zu übersetzen wäre mit riesigem Aufwand verbunden, während EVAL dafür Matlabs Bordmittel verwendet. Tückisch bleiben dabei die unkontrollierbaren User: STR2NUM läßt auch ohne mit der Wimper zu zucken "!format C:" laufen.

Gruß, Jan
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.