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

Matrix umformen, unterschiedlich lange Spalten

 

Tura
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 22.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2014, 09:08     Titel: Matrix umformen, unterschiedlich lange Spalten
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.05.2014, 13:46     Titel:
  Antworten mit Zitat      
Hallo

stellst du dir so was vor:
Code:

% Ausgangsmatrix/Beispielmatrix
A          = [rand(11,1), [0,1,2,0,1,0,1,2,3,0,1]'];
% 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          =  NaN(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);

 


Zuletzt bearbeitet von denny am 27.05.2014, 11:44, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Tura
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 22.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2014, 16:23     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.05.2014, 16:56     Titel:
  Antworten mit Zitat      
Zitat:
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          =[2 0;3 1;4 2;3 3;2 4;3 0;2 1;3 2;4 3;2 0];
% 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);

display(M)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Tura
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 22.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2014, 08:07     Titel:
  Antworten mit Zitat      
Vielen Dank, das hat so funktioniert wie ich es mir vorgestellt habe!
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.