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

cell2mat - nicht nachvollziehbarer fehler

 

haveNoIdeaOfWhatIamDoing

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2014, 08:55     Titel: cell2mat - nicht nachvollziehbarer fehler
  Antworten mit Zitat      
Hi @all,

ich kämpfe schon eine weile mit dem Matlab Befehl "cell2mat".

Problem ist folgendes:
Ich habe einen 3-dimensionalen cell-array:

Code:
b(:,:,1) =

    []    [7.1791]
    []    [8.9792]
    []    [8.9167]
    []    [4.0113]


b(:,:,2) =

    []    [6.6020]
    []    [9.2690]
    []    [9.3438]
    []    [3.9771]


beim Wandel in eine Matrix, erwarte ich da eigentlich folgendes:

Code:
b = cell2mat(b(:,2,:))

b(:,:,1) =

    7.1791
    8.9792
    8.9167
    4.0113


b(:,:,2) =

    6.6020
    9.2690
    9.3438
    3.9771


Raus kommen tut aber dies:

Zitat:
Error using cat
Dimensions of matrices being concatenated are not consistent.

Error in cell2mat (line 119)
ct{mref{:}} = cat(cdim+1,c{mref{:},:});


Nun verstehe ich den Fehler nicht, da ich keine Inkonsitenz erkennen kann.

Weiß jemand Bescheid?

Grüße


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2014, 10:05     Titel:
  Antworten mit Zitat      
Code:

b = rand(4,2,2);
b = mat2cell(b,[1 1 1 1],[1 1],[1 1]);
b(:,1,:) = {[]}
cell2mat(b(:,2,:))
 


Diese Beispiel funktioniert bei mir. Bei dir auch?

viele Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
haveNoIdeaOfWhatIamDoing

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2014, 11:29     Titel:
  Antworten mit Zitat      
hmm... scheint als hätte ich das Beispiel falsch gepostet.

Nochmal von vorne:

Code:
b

b(:,:,1) =

    []    [1.5884]
    []    [1.1770]
    []    [0.9131]
    []    [1.6280]


b(:,:,2) =

    []    [1.7233]
    []    [1.1184]
    []    [1.1046]
    []    [1.6937]


jetzt will ich ne matrix draus bauen ohne die leeren zellen. Also:

Code:

mündet in dem Fehler.
Zitat:
Error using cat
Dimensions of matrices being concatenated are not consistent.

Error in cell2mat (line 119)
ct{mref{:}} = cat(cdim+1,c{mref{:},:});


so funktioniert es:

Code:
b = cell2mat(b(:,2,:))

b(:,:,1) =

    1.5884
    1.1770
    0.9131
    1.6280


b(:,:,2) =

    1.7233
    1.1184
    1.1046
    1.6937


allerdings weiß ich nicht welche zellen leer sind, kann also die "2" gar nicht angeben.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.04.2014, 12:38     Titel:
  Antworten mit Zitat      
Das liegt an der leeren Zellen, also solltest du leeren Zellen, mit NaNs z B. vorher auffüllen

Code:

b = rand(4,2,2);
b = mat2cell(b,[1 1 1 1],[1 1],[1 1]);
b(:,1,:) = {[]}
emptypos = cellfun('isempty',b)

b(emptypos) = {NaN}
cell2mat(b)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
haveNoIdeaOfWhatIamDoing

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2014, 08:21     Titel:
  Antworten mit Zitat      
Danke für die Antwort.

Sry, hab mich lange nicht gemeldet. Habs anders gelöst und dann vergessen. Der Clou an der cell2mat Funktion ist ja gerade, dass die leeren Zellen einfach weggeschnitten werden - dachte ich jedenfalls. Bei Zeilen die nur leere Zellen enthalten funktioniert dies nämlich einwandfrei.

Sieh Beispiel:
Code:

for i = 1:4
   for j = 1:3
      if i == 1
         Sc{i,j} = [];
      else
         Sc{i,j} = randi(10);
      end
   end;
end;

Sc =

     []     []     []
    [5]    [7]    [8]
    [8]    [3]    [7]
    [7]    [2]    [2]


Und cell2mat läuft einwandfrei:

Code:
cell2mat(Sc)

ans =

     5     7     8
     8     3     7
     7     2     2


jetzt die Spalte leer:

Code:
Sc(1,2:3) = {3, 4};
Sc(2:4,1) = {[]}

Sc2 =

    []    [3]    [4]
    []    [7]    [8]
    []    [3]    [7]
    []    [2]    [2]

cell2mat(Sc)

ans =

     3     4
     7     8
     3     7
     2     2


funktioniert zu meiner Überraschung auch. Wo ist der Unterschied?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.04.2014, 12:11     Titel:
  Antworten mit Zitat      
Hallo

Bei der 3-D Matrix funktioniert das so nicht, weil die Operationen mit 3-D Matrizen komplexer sind. Deswegen werden 3-D-Matrizen in CELL2MAT getrennt behandelt. Und wenn du rein schaust das passiert dann dort folgendes:
Also z.B gegeben sei 2x3x3 Cell-Matrix, in allen 3 Matrizen ist die 2.Spalte Leer
cell2mat fasst die Werte zuerst nach 3. Dimension in einer 2x3 Cell zusammen, und hier entstehen schon Dimension-Unterschiede:
[1x1x3 double] [0x0x3 double] [1x1x3 double]
[1x1x3 double] [0x0x3 double] [1x1x3 double]
Danach wird zeilenweise zusammengefasst zu einer 2x1 Cell, hier aber kracht das bereits, weil die Dimensionen nicht stimmen, Dimension von leeren Elementen ist hier nicht Null. Bei CAT wird die Größe der Einzelelemente überprüft, wenn die nicht stimmt kommt zu einem Fehler.

Wäre z.B. aber das Teilergebnis folgend, dann hätte das wie bei 2D in deinen Beispielen funktioniert:
[1x1x3 double] [] [1x1x3 double]
[1x1x3 double] [] [1x1x3 double]

Man kann das als Bug ansehen, wohl aber bei CAT, weil diese Funktion behandelt [] und [0x0x3 double] unterschiedlich.



was bei 3-D funktioniert ist folgendes:

Code:

A= num2cell(round(100*rand(4,4,3)))
A(:,:,1)={[]}
cell2mat(A)
 

dann sind alle Teilergebnis Matrizen in 4x4 Cell 1x1x2 groß, also Dimension stimmt, funktioniert
oder
Code:

A= num2cell(round(100*rand(3,3,3)))
A(:,1,1)={[]}
A(:,2,2)={[]}
A(:,3,3)={[]}
cell2mat(A)
 

auch hier Dimension aller Teilergebnisse ist 1x1x2;
Private Nachricht senden Benutzer-Profile anzeigen
 
haveNoIdeaOfWhatIamDoing

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2014, 12:43     Titel:
  Antworten mit Zitat      
Danke. Hab das Problem anders gelöst, aber trotzdem danke für die Info. Gut zu wissen.
 
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.