Verfasst am: 14.06.2014, 14:03
Titel: Werte aus matrix auslesen und in struct abspeichern
Hallo zusammen,
Ich habe zwei n x m Matrizen, die ich mit reshape geordnet habe.
Ich vergleiche nun die einzelnen Spaltenvektoren mit corcoeff. Die Kreuzkorrelation der beiden Vektoren wurde bereits ausgeführt.
Nun möchte ich, nachdem ich die Spaltenvektoren verglichen habe, die beiden in einem Struct abspeichern und den Struct auch eine fortlaufende Nummer geben. Ich brauche wahrscheinlich eine for-schleife dazu um alle Spalten durchzugehen. Anbei mein Code. Vielen Dank.
ist meine Frage zu umständlich beschrieben? Ich würde gerne allgemein wissen, wie ich zwei beliebige Spalten aus zwei verschiedenen Matrizen extrahieren kann und diese in einem Struct abspeichere. Da dies mit mehreren Spalten aus den zwei Matrizen geschehen soll, bin ich mir nicht schlüssig wie ich das genau machen kann.
Verfasst am: 20.06.2014, 00:15
Titel: Re: Werte aus matrix auslesen und in struct abspeichern
Hallo danielp,
Ich verstehe weder die Frage noch den geposteten Code.
Zitat:
Ich habe zwei n x m Matrizen, die ich mit reshape geordnet habe.
Was soll der Code mit dem RESHAPE bewirken? Ist es gewollt, dass der Code nur bis zur Länge 500 funktionieren soll? Meinst Du wirklich LENGTH(Px) oder geht es um SIZE(Px, 1)?
Zitat:
Nun möchte ich, nachdem ich die Spaltenvektoren verglichen habe, die beiden in einem Struct abspeichern und den Struct auch eine fortlaufende Nummer geben.
Wenn Du die Daten in einem Struct speicherst, welcher Struct kann dann eine fortlaufende Nummer haben? Meinst Du die Feldnamen? Das wäre eine schlechte Idee, denn das wäre das Verstecken eines Indexes in Namen der Variablen. Wenn man etwas indiziert, ist ein echte Index aber viel praktischer.
Die automagische Vergabe von Namen mit versteckten Indices ist dagegen ein typischer Anfängerfehler und wurde deshalb schon hunderte Male in diesem Forum besprochen. Eine Suche würde sich also lohnen.
Code:
% [~ m]= size Px; % Das ist keine valide Matlab-Syntax. Meinst Du:
m = size(Px, 2);
S.value = cell(1, m);
for i=1:m
x = corrcoef(P1(:,m),P2(:,m));
if x>0,8% Meinst Du 0.8 ? x ist eine Matrix, welches Element meinst Du?
S.value{m} = x;
else
???
end end
vielen Dank für deine Antowrt und entschuldige vielmals die ungenaue Beschreibung meines Problems! Ich möchte jeweils die beiden gleichen Spalten von Px und Py in einem Struct abbspeichern.
Du hast mir mit deinen Code-Anmerkungen sehr viel geholfen! Wenn ich es manuell im Command Window probiere , wird im Struct genau das abgespeichert, was ich möchte. Mein einziges Problem nun ist, wie ich mir das Struct aus der Funktion richtig ausgeben lasse. So wie ich es mache, wird nur der letzte Wert der for-Schleife abgespeichert.
So wie ich es mache, wird nur der letzte Wert der for-Schleife abgespeichert.
Die erklärung ist nicht genau genug, um sie wirklich nachvollziehen zu können. Was siehst Du genau und wie soll es aussehen?
Ist es wirklich gewollt, dass Px 500 Spalten hat, wenn die Input-Länge durch 500 teilbar ist, aber andernfalls 500 Zeilen? Das kommt mir immer noch merkwürdig vor. Da aber nicht dokumentiert ist, welches Verhalten beabsichtig ist, habe ich das nur mal ein wenig zusammengefasst.
m = size(Px, 2);
Daten = cell(2, m);
for i=1:m
x=corrcoef(Px(:,m), Py(:,m));
if x(1,1)>0.9
Daten{1,m} = [Px(:,m) Py(:,m)];
else
Daten{2,m} = [Px(:,m) Py(:,m)];
end end
Nun werden in der ersten Zeile von "Daten" die jenigen Px und Py-Spalten zurückgegeben, deren Korrelations-Koeffizient größer als 0.9 ist, und in der zweiten die anderen.
Ein Struct wird für diesen Zweck aber gar nicht benötigt. Insofern ist die Fragestellung noch nicht klar für mich.
Super vielen Dank! Da hast du recht, das habe ich noch nicht geändert. Da mod 0 so gut wie nie vorkommt, habe ich vergessen, das zu ändern. Danke.
Bezüglich fort-schleife: Nach Ausführen des Codes sollen, wie du sagst, in der ersten Zeile alle Px,Py-Paare stehen, deren Korrelationskoeffizient >0.9 ist, in der zweiten Zeile alle Paare, deren Korrelationskoeffizient < 0.9 ist.
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.