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

Länge eines 3D-cell-Arrays (?) in einem struct bestimmen

 

kamel2626

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 12:03     Titel: Länge eines 3D-cell-Arrays (?) in einem struct bestimmen
  Antworten mit Zitat      
(MATLAB)

Hallo zusammen,

im Anhang findet ihr ein Matlab-file, das einen 1x1-struct enthält. Dieser struct enthält wiederum cell-Arrays (?, hier bin ich mir nicht sicher, ob es ein anderes array, ... ist) d00 bis d15. Jedes dieser arrays ist dreidimensional.

Die ersten beiden Dimensionen sind immer 3x4. Die dritte Dimension ist von d** zu d** verschieden.

In einer for-Schleife möchte ich jeweils alle Elemente der dritten Dimension aufrufen. Dazu muss ich für jedes d** die Länge bestimmen.

Kann mir jemand sagen, wie man das umsetzen kann? Ich würde mich sehr freuen!
Ich habe bereits im Internet in verschiedenen Foren recherchiert und bin nicht fündig geworden.

Vielen Dank!
kamel2626

M.zip
 Beschreibung:
Datei M.mat in M.zip

Download
 Dateiname:  M.zip
 Dateigröße:  21.76 KB
 Heruntergeladen:  251 mal


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.09.2013, 12:26     Titel:
  Antworten mit Zitat      
liefer bitte nur die daten die man braucht und nicht irgendein ans ( das lässt sowieso darauf schließen das die daten nicht ordentlich gespeichert vorliegen) ^^ es währe einfacher gewesen cells zu benuten als weitere dynamisch angelegte structs. dann hätte man den verwendeten index auch als index benutzen können. jetzt must du umständlich wie du die daten angelegt hast auch umständlich wieder auslesen.
Code:
sollte dir helfen die namen zu ermitteln. mit
Code:
bekommt man die größe und wie man stucts dynamisch adressiert steht in der doc zu stucts.
grüße winkow
_________________

richtig Fragen
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: 17.09.2013, 13:38     Titel: Re: Länge eines 3D-cell-Arrays (?) in einem struct bestimme
  Antworten mit Zitat      
Hallo kamel2626,

Bitte poste eine Frage nicht in mehreren Foren gleichzeitig. Bei einem solchen "Cross-Posting" verschwenden die Leser beider Foren und die Antwortenden Zeit, wenn sie eine Antwort schreiben, die bereits an anderer Stelle gepostet worden ist. Und die Zeit der Antwortenden zu verplempern ist ein absolutes DON'T in einem Forum.

Zitat:
Dieser struct enthält wiederum cell-Arrays (?, hier bin ich mir nicht sicher, ob es ein anderes array, ... ist) d00 bis d15.

Mit dem CLASS Befehl kannst Du sehr leicht herausfinden, welchen Typ die Variablen haben. Solche leicht zu erledigenden Aufgaben sollte man besser selbst erledigen, als die Leser raten zu lassen.

Bitte poste den relevanmten Matlab Code, der die Daten erzeugt. Das ist viel besser als ein File zu verlinken. Ich selbst habe z.B. kein Matlab zur Verfügung und es ist darum umständlich an den Inhalt der Daten zu gelangen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
kamel2626

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 21:03     Titel:
  Antworten mit Zitat      
Hallo Winkow und Jan S,

danke für eure Antworten. Sorry, habe es bisher nicht geschafft, den Stuct allein (z.B. als Variable) zu speichern. Den
Code:
Befehl kannte ich noch nicht, ich bin Matlab-Neuling. Ich benutze zur Auswertung ein von jemand anderem geschriebes Programm, mit dem ich bereits Messungen ausgewertet habe. Weiter auszuwertende Daten sind in Matlabdateien gespeichert, auf die ich nun zur weiteren Auswertung zugreifen muss.

Mit dem Befehl
Code:
kann ich gut auf die Inhalte d** von M zugreifen. Der Befehl
Code:
liefert mir noch nicht die Größe des cell-Arrays.

Folgendes habe ich versucht:

Code:


F=fieldnames(M)
F =

    'd00'
    'd01'
    'd02'
    'd03'
    'd04'
    'd05'
    'd06'
    'd07'
    'd08'
    'd09'
    'd10'
    'd11'
    'd12'
    'd13'
    'd14'
    'd15'


sF=size(F)
sF =

    16     1


sF5=size(F(5))
sF5 =

     1     1


cellfun(@length,F(1));
cf=cellfun('size',F,3)
cf =

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1


cellsz = cellfun(@size,F,'uni',false);
csz=cellsz{:}
csz =

     1     3

 


Ich hätte gern am Ende ein Ergebnis wie

Code:


sz = ....
sz =

     3    4    *

 

in dem man alle drei Dimensionen aufgelistet bekommt, wobei mir die dritte die wichtigste ist.

Ich habe den Kommentar in keinem anderen Forum gepostet.
Gruß, kamel2626
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 21:14     Titel:
  Antworten mit Zitat      
Das hier ist der Code, mit dem M erzeug wird:

Code:

u=15;
a=ls;
help=[];

for i=3:length(a)
    dat.(sprintf('M%02i',i-2))=load(a(i,:));
end
fields=fieldnames(dat);
s=0;
for i=0:u
    dista=i;
     fol.(sprintf('d%02i',dista))=0;
      M.(sprintf('d%02i',dista))=zeros(3,4);
end
for i=1:length(fields)
    fields2=fieldnames(dat.(fields{i,:}));
    for k=1:length(fields2)
        s=s+1;
        if  ~strcmp(fields2{k,:},'refnr')
            nr=str2double(strrep(fields2{k,:},'Particle',''));
            partipos=dat.(fields{i,:}).(fields2{k,:}).Info.(sprintf('k%02i',nr));
            refpos=dat.(fields{i,:}).(fields2{k,:}).Info.(sprintf('k%02i',dat.(fields{i,:}).refnr));
            refmatrix=[];
            for j=1:2
                    vector=dat.(fields{i,:}).(sprintf('Particle%02i',dat.(fields{i,:}).refnr)).MatrixM01(:,j);
                    [vector angle]=matrixtrafo(vector,refpos',partipos');
                    refmatrix=[refmatrix,vector];
            end

            nr=str2double(strrep(fields2{k,:},'Particle',''));
            dista=round(2*dat.(fields{i,:}).(fields2{k,:}).Info.(sprintf('k%02i',nr))(1));
            help=[help; dat.(fields{i,:}).(fields2{k,:}).Info.(sprintf('k%02i',nr))(1)];

            if dista>u
                continue
            end
            fol.(sprintf('d%02i',dista))=fol.(sprintf('d%02i',dista))+1;
            M.(sprintf('d%02i',dista))(:,:,fol.(sprintf('d%02i',dista))+1)...
                =dat.(fields{i,:}).(fields2{k,:}).MatrixM01;

    end
end
Data.M=M;
 
 
KaMe
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 17.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 23:54     Titel:
  Antworten mit Zitat      
Habe soeben herausgefunden, dass man die Größe des cell-arrays auch über die dynamische Adressierung bekommt:

Code:
size(M.d**)
      =    3    4    (..)
 


Danke nochmal an alle fürs Mitdenken und die Tipps!
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: 18.09.2013, 00:02     Titel:
  Antworten mit Zitat      
Hallo kamel2626,

Die Indices in den Feld-Namen machen das Programm gruselig unübersichtlich. Davon kann ich immer nur heftig abraten. Ein Cell-Array wäre viel einfacher, da man dann direkt einen Index als Index verwnden kann.

Du möchtest nicht die Längen der Namen der Felder bestimmen, sondern die enthaltenen Werte. Also: STRUCT2CELL statt FIELDNAMES:
Code:
Data = struct2cell(M);
s(1, :) = cellfun('size', Data, 1);
s(2, :) = cellfun('size', Data, 2);
s(3, :) = cellfun('size', Data, 3);
disp(s')

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
KaMe
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 17.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2013, 00:19     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo kamel2626,

Die Indices in den Feld-Namen machen das Programm gruselig unübersichtlich. Davon kann ich immer nur heftig abraten. Ein Cell-Array wäre viel einfacher, da man dann direkt einen Index als Index verwnden kann.

Du möchtest nicht die Längen der Namen der Felder bestimmen, sondern die enthaltenen Werte. Also: STRUCT2CELL statt FIELDNAMES:
Code:
Data = struct2cell(M);
s(1, :) = cellfun('size', Data, 1);
s(2, :) = cellfun('size', Data, 2);
s(3, :) = cellfun('size', Data, 3);
disp(s')

Gruß, Jan



Hallo Jan,
dankeschön. Für künftige eigene Programmierungen werde ich Cell-Arrays verwenden.

Wenn ich deinen Code verwende, erhalte ich für diese drei Zeilen
Code:

s(1, :) = cellfun('size', Data, 1);
s(2, :) = cellfun('size', Data, 2);
s(3, :) = cellfun('size', Data, 3);
 

jeweils die folgende Fehlermeldung:
Code:
Subscripted assignment dimension mismatch.

Error in Moden_Amplituden (line ...)
            s(1,:) = cellfun('size', Data, 1)

Grüße, KaMe
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.