Verfasst am: 22.05.2014, 09:08
Titel: Matrix umformen, unterschiedlich lange Spalten
Hallo
Ich bin recht neu bei Matlab und habe eine kurze Frage: Ich habe eine zweispaltige Matrix in der in der ersten Spalte Amplitudenwerte stehen und in der zweiten Spalte hochzählende Werte die immer wieder bei Null beginnen, allerdings nicht nach immer der gleichen Anzahl von Zeilen. Ich würde jetzt gerne eine Matrix erzeugen in der in jeder Spalte die Amplitudenwerte stehen und eine neue Spalte angefangen wird wenn die hochzählenden Werte der 2. Spalte der Ausgangsmatrix wieder bei 0 starten.
Ich habe es schon mit vec2mat versucht, allerdings hat man da das Problem, dass man die Spaltenlänge angeben müsste, die hier ja nicht immer gleich ist. Fehlende Einträge in Spalten die kürzer sind als die Maximalspaltenwerte würde ich gerne mit Nullen auffüllen.
Ich hoffe das war einigermaßen verständlich formuliert, würde mich über Hilfe freuen.
danke für die antwort! meine ausgangsmatrix sieht allerdings etwas anders aus, z.B.:
2 0
3 1
4 2
3 3
2 4
3 0
2 1
3 2
4 3
1 0
...
wobei die erste Spalte die Amplituden enthält und die zweite Spalte die sich wiederholende hochzählende Zahlenfolge, die allerdings nicht immer zum gleichen Wert hochzählt. Müsste man dafür mit einer Schleife arbeiten?
danke für die antwort! meine ausgangsmatrix sieht allerdings etwas anders aus, z.B.:
2 0
3 1
4 2
3 3
2 4
3 0
2 1
3 2
4 3
1 0
...
Okay da haben wir uns glaube missverstanden, schaue dir das Ergebnis in M, willst du das Ergebnis so haben. Das ist nämlich die komplette Lösung, ohne Schleifen
PS: Ich habe Initialisierung von M ausgebessert, habe leider überlesen, dass du die fehlenden Werte mit Nullen ausgefüllt haben wolltest.
Code:
% deine Beispielmatrix
A =[20;31;42;33;24;30;21;32;43;20];
% Nullposition suchen
null_pos = A(:,2) == 0;
% Laenge der einzelnen Intervalle bestimmen
len = diff(find(cat(1, null_pos, 1)));
%
% Maximum Zeilen und Spalten der Neuen Matrix bestimmen
maxrow = max(len);
maxcol = sum(null_pos);
% Ergebnismatrix vorinitialisieren
M = zeros(maxrow, maxcol);
%
% Spalten für Intervalle in der neuen Matrix bestimmen
cols = cumsum(null_pos);
%
% Zeilen für Intervalle in der neuen Matrix bestimmen
rows = ones(size(null_pos));
pos = cumsum(len(1:end-1)) + 1;
rows(pos) = -(len(1:end-1)-1);
rows = cumsum(rows);
%
% Umrechnen der Zeilen-/Spalten- Indizien zur Lineare Indizien
lin_idx = sub2ind(size(M), rows, cols);
% schreiben der Amplituden in die Matrix
M(lin_idx) = A(:, 1);
Vielen Dank, das hat so funktioniert wie ich es mir vorgestellt habe!
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.