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

Vektoren in Matrix überführen

 

netXfo
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.07.17
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 20.07.2017, 09:04     Titel: Vektoren in Matrix überführen
  Antworten mit Zitat      
Guten Morgen,

ich habe folgenden Thematik. Es werden Messwerte aus txt-Dateien ausgelesen und bearbeitet (es werden hierbei zwei zusammengefasst). Im nächsten Schritt möchte ich aber die Daten in einer 3D-Matrix zwischenspeichern/ sammeln, um sie ggf. in andere Funktionen auszulagern/ zu übergeben.

Aktuell sieht der Code so aus:
Code:

for I=1:amount
% Einlesen
...
data    = [d w t op ];
data    = sortrows(data,3); % Arrangieren der Daten
d       = data(:,1); % Werden in der aktuellen Version der Auswertung gebraucht, sollen aber später umgangen werden
w       = data(:,2);
t       = data(:,3);
...
collector   = [d w t x];
...
end
 

d, w, t, x sind jeweils Spaltenvektoren der eingelesenen Datei I. Ich möchte jetzt collector in I-Richtung weiter schreiben, also jeden neuen Datensatz daneben legen.

Hat jemand eine Idee, wie ich das machen kann? Problem wird auch sein, dass je nach Datensatz d, w, t, x unterschiedlich lang sein werden.
_________________

Write, write, write your code gently down the stream,
merrily, merrily, merrily life is but a dream
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: 21.07.2017, 10:13     Titel: Re: Vektoren in Matrix überführen
  Antworten mit Zitat      
GHallo netXfo,

Was ist denn die "I-Richtung"?

Ich rate mal:
Code:
collector = zeros(amount, 4);
for I=1:amount
  ...
  collector(I, :) = [d w t x];
end

Gruuß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
netXfo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.07.17
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 21.07.2017, 13:47     Titel:
  Antworten mit Zitat      
Hi Jan,

deine Lösung produziert folgenden Fehler:

Dimensions of matrices being concatenated are not consistent.

Welchen ich erwartet habe:
Zitat:
Problem wird auch sein, dass je nach Datensatz d, w, t, x unterschiedlich lang sein werden.


I-Richtung bezieht sich darauf, dass ich 2D-Matrizen [d w t x] neben einander legen möchte in die Dimension I.

Kann man nicht auch in die Zelle collector(I,1) die Matrix [d w t x] einlesen? Wenn ja, wie sähe das in Codeform aus?

Anbei sind meine Ideen, dies zu lösen. Es hängt nur an der Umsetzung.

Gruß netXfo

Matrixidee.pdf
 Beschreibung:
Hier mal eine Skizze zur Idee

Download
 Dateiname:  Matrixidee.pdf
 Dateigröße:  57.26 KB
 Heruntergeladen:  301 mal

_________________

Write, write, write your code gently down the stream,
merrily, merrily, merrily life is but a dream
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.07.2017, 15:22     Titel:
  Antworten mit Zitat      
wenn du unterschiedlich lange Datensätze hast, dann musst du diese in der Cell ablegen, du kannst diese Spaltenvektoren auch untereinander schreiben.

Code:

collector = cell(1,amount);
for I=1:amount
  ...
  collector{I} = [d w t x];
end

collector = cat(1, collector{:})
 


Sonst wenn du 3D Matrix haben möchtest, würde ich zuerst in Cell aufsammeln, dann musst du auf die Maximale Dimension normieren

Code:

collector = cell(1,amount);
for I=1:amount
  ...
  collector{I} = [d w t x];
end

dim = max(cellfun(@(x) size(x, 1), collector))

M3d = nan(dim, 4, amount)

for k=1:amount
  M = collector{k};  
  M3d(1:size(M,1), 1:size(M,2), k) = M;
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
netXfo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.07.17
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 24.07.2017, 07:52     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfestellungen. Klappt soweit, nur sagt mir MATLAB jetzt, das:

Function 'subsindex' is not defined for values of class 'cell'.
_________________

Write, write, write your code gently down the stream,
merrily, merrily, merrily life is but a dream
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.07.2017, 09:22     Titel:
  Antworten mit Zitat      
Hallo

vielleicht den Code posten, wo das auftritt. Ansonsten kann ich nicht viel dazu sagen.
Es kann auch sein dass reservierte Matlab-Funktionen überladen hast
wie z.B. hier
https://de.mathworks.com/matlabcent.....-for-values-of-class-cell
Private Nachricht senden Benutzer-Profile anzeigen
 
netXfo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.07.17
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 24.07.2017, 11:24     Titel:
  Antworten mit Zitat      
Das Problem erscheint mit Aufrufen der Funktion.

collector kommt aus vorherigem Quellcode und ist so eingebunden:
Code:

cutterreturn = cutter(collector);
 


Ausgelagerte Funktion
Code:

function refund=cutter(collector)

d = collector(:,1);
w = collector(:,2);
       
    ci         = zeros(10,1);
    share   = zeros(10,1);
    D32c    = zeros(10,1);
    D30c    = zeros(10,1);
    Dmc     = zeros(10,1);
    D10c    = zeros(10,1);
    ...
    countc  = zeros(10,1);
               
    for i=1:10;
        ci(i,1)     = 500*i/10;
        share(i,1)  = i/10;
        cutteri     = [d w];
        cutteri (cutteri(:,1)> ci(i,1) )=0;
        cutteri (cutteri(:,1) == 0, :) = [];
        countc(i,1)      = nnz(cutteri(:,1));
        ...
        D32c(i,1)   = 6*(vic(i,1)/sic(i,1));
        D10c(i,1)   = mean (cutteri(:,1));
        Dmc(i,1)    = median (cutteri(:,1));
        D30c(i,1)   = (vic(i,1)/countc(i,1))^(1/3);    
    end

refund = [D10c, D30c, D32c, Dmc];
end
 


Wobei ich, wenn ich nicht mit dem I arbeite auch einen Fehler bekomme:

Subscript indices must either be real positive integers or logicals.

Mir ist keine Funktion mit dem Name Cutter bekannt.
_________________

Write, write, write your code gently down the stream,
merrily, merrily, merrily life is but a dream
Private Nachricht senden Benutzer-Profile anzeigen
 
netXfo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 04.07.17
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 24.07.2017, 11:31     Titel:
  Antworten mit Zitat      
Problem gelöst. Es geisterte eine Variable unter dem Name cutter im Code rum. Danke für die Hilfestellung
_________________

Write, write, write your code gently down the stream,
merrily, merrily, merrily life is but a dream
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 - 2024 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.