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

Rückgabe Empty Matrix [] in 2D MAtrix eintragen

 

Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 15.11.2010, 15:50     Titel: Rückgabe Empty Matrix [] in 2D MAtrix eintragen
  Antworten mit Zitat      
Hi,

ich habe 2 Rückgaben aus einem mex-file.
Ein Skalar und einen Array. Werden jeweils in
verschiedene Matritzen eingetragen.
Es kann sein, dass [] also Empty MAtrix zurückgegeben wird.
Wie kann ich das in eine 2D-MAtrix eintragen?
Die Indizierung ist nicht das Problem, sondern an
der jeweiligen Stelle soll einfach nichts stehen!

z.B.:

a=[ 1 2 3;
1 [] 8];
Was ja leider nicht geht. Null ist verboten!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.11.2010, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

da eine numerische Matrix immer quadratisch sein muss, sind leere Felder nicht erlaubt. Entweder du fuellst die Felder mit NaN (falls dies in deinem Fall erlaubt ist) oder du musst auf Cell-Arrays zurueckgreifen.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 15.11.2010, 17:11     Titel:
  Antworten mit Zitat      
Ich versuch schon das mit cells umzusetzen...
bisher mit mässigem Erfolg. Hier das wichtigste

Code:

 intensitaet=num2cell(zeros(arraylaenge,length(min(Theta):thetastep:max(Theta)),strahlen));% Traceval=zeros: Vorbelegung mit Nullen für Speicherplatzreservierung
 zeitverzoegerung=num2cell(zeros(1,length(min(Theta):thetastep:max(Theta)),strahlen));

for ...
for ...

 [intensitaet{1:arraylaenge,ind,strahl},zeitverzoegerung{:,ind,strahl}]=funktionsaufruf(...)

 


Fehlermeldung:

??? koorBrech.c erzeugt nur 2 Rückgabeparameter. (Selbst als Fehlermeldung definiert)

Zeitverzögerung ist das Skalar und die Ausgabe wäre []
intensitaet ist das Array Emptymatrix 0-arraylange
Matlab sagt mir also, dass angeblich zu viele Parameter asugegeben werden sollen. Stimmt aber nicht. Lass ich es ohne Index ausgeben passt alles, wird aber immer wieder überschieben... WO liegt der Fehler?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.11.2010, 17:32     Titel:
  Antworten mit Zitat      
Hallo Achi,

kann ich dir leider (ohne Minimalbeispiel) auch nicht helfen, da ich selber noch nicht mit mex-files gearbeitet habe. Hasst du aber mal probiert die geschweiften Klammern durch Runde zu ersetzen?
Code:

[intensitaet(1:arraylaenge,ind,strahl),zeitverzoegerung(:,ind,strahl)]=funktionsaufruf(...)
 


Aendert dies etwas an der Fehlermeldung?

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 15.11.2010, 17:40     Titel:
  Antworten mit Zitat      
Ich denk mal das Problem ist grundlegender.

Code:

 b=zeros(3,3,3);
b(1:3,3,3)=[1 2 3]
b(:,:,1) =
     0     0     0
     0     0     0
     0     0     0
b(:,:,2) =
     0     0     0
     0     0     0
     0     0     0
b(:,:,3) =
     0     0     1
     0     0     2
     0     0     3
Das geht aber nicht:

 a=cell(3,3,3)
a(:,:,1) =
     []     []     []
     []     []     []
     []     []     []
a(:,:,2) =
     []     []     []
     []     []     []
     []     []     []
a(:,:,3) =
     []     []     []
     []     []     []
     []     []     []
a{3,3,1:3}=[4 3 4]
??? The right hand side of this assignment has too few values to satisfy
 the left hand side.

 


Ändere ich die geschweifetn in () bekomme ich die Meldung:

??? Subscripted assignment dimension mismatch.

(Die mex-files stllen nicht das Problem dar)
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 15.11.2010, 17:50     Titel:
  Antworten mit Zitat      
Ich denke ich hab den Fehler:

es war nicht num2cell, sondern mat2cell was ich brauchte!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.11.2010, 17:52     Titel:
  Antworten mit Zitat      
Hallo,

mit Minimalbeispiel kann ich helfen Smile.

Ne im Ernst, fuer die Belegung in die Cell musst du die Daten auch erst in eine Cell umwandeln. Fuer dein Beispiel wuerde dies so aussehen (deswegen auch die Frage nach der Klammerart):
Code:

a = cell(3,3,3);
a(3,3,1:3) = num2cell([4 3 4])
 


Kannst du dies auf deinen Code irgendwie anwenden?

Edit (dein Post kam eher): also wenn du jedes einzelne Matrixelement in eine einzelne Zelle packen willst brauchst du eigentlich num2cell, mit mat2cell kannst du eine Komplette Matrix in eine Zelle einfuegen, es ist also immer noch ein numerischer Array in der Zelle, was ja mit den leeren Werten nicht geht? Oder sehe ich das falsch?

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 15.11.2010, 18:03     Titel:
  Antworten mit Zitat      
Danke hab ich mittlerweile.

Code:


intensitaet=mat2cell(zeros(...))  % Vorbelegung
zeitverzoegerung=mat2cell(zeros(...))
for...
for...
[intensitaet{:,ind,strahl},zeitverzoegerung{:,ind,strahl}]=aufruf
 

schreibts dahin wo's sein soll. Danke.
Jetzt schmiert mir das nächste mex-file ab wenns dann diese [] fressen soll.
Na da bekomm ich auch noch hin!

Gruß Achi
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.11.2010, 10:49     Titel:
  Antworten mit Zitat      
Zu deinem Post noch mal:
es geht doch:
Code:

b={1 2 3 4 [] [] [] [] [] 6 7 8  9;
   1 2 3 4 [] [] [] [] [] 6 7 8  9 };
 for a=1:numel(b)
         c=cell2mat(b(a));
         if isempty(c)
         continue;
         else fprintf('c= %i\n',c)
         end
 
oder reden wir jetzt aneinander vorbei?

EDIT: hab dich verstanden. Meins war ja rückwärts. Hab aber noch Probleme damit. Falls du wieder online bitte melde dich bitte wieder.
DANKE
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.11.2010, 13:17     Titel:
  Antworten mit Zitat      
Hallo Achi,

obigen Code koenntest du folgendermasser vereinfachen:
Code:

b(cellfun('isempty',b)) = [];
c = cell2mat(b);
 


Ansonsten, wo haengt es denn noch?

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.11.2010, 14:19     Titel:
  Antworten mit Zitat      
Also mein Code ist gekürzt so.

Code:

arrayy=cell(5,5,5)
skalarr=cell(5,5,5)
for...
for...
[array,skalar]=aufruffunktion...
if ~isempty(skalar)
   arrayy(:,ind,indx)=num2cell(array);
   skalarr(:,ind,indx)=num2cell(skalar);
....

Jetzt will ich dann diese die Einträge an ALLEN Positionen haben ( was gegeben sein sollte) aufrufen und benutzen.

Code:

for...
for...
if ~isempty(skalarr)
  matarray=cell2mat(arrayy(:,ind,indx)
matskalar=cell2mat(skalarr(:,ind,indx)
[x,y]=aufrufmex(matarray,matskalar)
 

Aber anscheinend werden auch leere Matritzen an das mex-file geleifert und dieses stürtzt ab. Fehlermeldung gibts keine, weils viel zu schnell abschmiert.
Ich denke es liegt an der Abfrag: if ~isempty(skalarr), die nicht geeignet ist um den AUfruf gar nicht zu starten und leere Skalare weitergibt?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.11.2010, 14:45     Titel:
  Antworten mit Zitat      
Hallo,

hierbei hilf immer der Debugging Mode, geh Zeile fuer Zeile durch schaue dir die erstellten Werte an bzw. schau dir die Werte an die du deiner MEX-File uebergibst (dann sieht du ob leere Elemente verbleiben). Dies koenntest du z.B. so machen (diese Zeile vor MexFile packen, wenn leere Elemente enthalten sind springt er in If clause):
Code:

if any(cellfun('isempty',mat))
 

Was mich etwas wundert ist diese Zeile:
Code:

Moechtets du wirklich in jedem Schleifendurchlauf abfragen ob der gesamte Array Leer ist, oder nur ob das entsprechende Feld (Index) leer ist? Also so:
Code:

~isempty(skalarr(a,b,c))
 

Vielleicht trifft dies auch auf skalar zu, wobei ich nicht weiss ob dies wirklich nur ein Wert ist oder wie skalarr auch mehrdimensional.

Ansonsten ist es wirklich schwierig dir zu helfen ohne Werte oder Dimensionen der Variablen genau zu kennen Sad.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.11.2010, 15:07     Titel:
  Antworten mit Zitat      
Ich debbuge es ja auch schrittweise, daher weiss ich, dass bei dem Code den ich vorher geposted habe auch [] weitergegeben wurde:

z.B. NEIN will ich nicht, habe jeden Eintrag der cell wieder als Mat übertragen und dann abgefragt, ob das Skalar leer ist, falls so, dann soll es eine Iteration auslassen... das läuft jetzt schon 5-6 min(und ist noch nicht zuende), vorher brauchte es etwa 30 sek...
Ich muss das irgendwie anders bewerkstelligen.
ANY HINTS?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.11.2010, 15:20     Titel:
  Antworten mit Zitat      
Huch,

da war noch was, was ich vergessen habe im Code Embarassed was noch raus musste!

DANK dir Sco passt jetzt!
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 16.11.2010, 15:25     Titel:
  Antworten mit Zitat      
ABER mit dieser doofen Abfrage (if ~isempty())
ist der Code um eine viertel langsamer... Crying or Very sad
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.