Verfasst am: 08.10.2011, 12:23
Titel: gehäuftes Auftreten von Zahlenkombinationen in Matrix
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 = [9164473849 333432194049 44230331013 113619122149 7199104345 132148171046 331723424037 3637634938 26293949362 181517244431 43237201317 423740331723];
% 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
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).
Verfasst am: 08.10.2011, 13:45
Titel: Re: gehäuftes Auftreten von Zahlenkombinationen in Matrix
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.
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
Mir hat EVAL bei anderen Aufgaben schon viele gute Dienste geleistet.
Aber Du hast recht, besonders elegant und unkompliziert ist mein Script nicht.
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
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
Einstellungen und Berechtigungen
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
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.