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

Der Umgang mit emlmex - von M zu C

 

Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 18.07.2009, 06:44     Titel: Der Umgang mit emlmex - von M zu C
  Antworten mit Zitat      
Mein Ziel war es, ein Teilstück Code, welcher ohne aufwängie Matlabbefehle auskommt, auf C zu portieren und dann extern zu linken.
Im Hinterkopf hab ich da ne Zeitersparnis, da die Funkion ein paar Tausend Mal durchlaufen wird.

Nun zum ersten, kleineren Problem:
Wie immer weiss ich nicht genau, was ich tue, aber
Code:
treff=treff(1:t,:);

will emlmex nicht übersetzen, auch Indizierungen wie A(4,3) gehen nicht, A(3,1) hingegen schon.
Das der Cast was mit sub zu tun hatte, wusste ich, rausgekommen ist dann:
Code:
S = substruct('()', {1:t,':'});
out=subsref([treffX treffY treffZ],S);

wieder was gelernt, aber bei der Deklaration vom S ist wieder ein subsref drinnen! Ein Teufelskreis.
Code:
eml.extrinsic('subsasgn')
eml.extrinsic('subsref')
eml.extrinsic('substruct')
bringt auch keine Besserung.

Überseh ich hier was ?
(Wär nicht das erste Mal, ich wollt grad schreiben, dass es mir keine mex-File ausgeworfen hat.... Rolling Eyes )


Das grössere Problem: Ich habe meine Eingangsmatrizen aufgetrennt, aus a (mx2) z.b. a1 und a2 gemacht.
Jetzt kommt folgende Meldung:
MATLAB expression 'a1' is not of the correct size: expected [1x1] found [140533x1].
Wie soll ich im M-code schreiben, dass ich mehr als einen Skalar erwarte ??
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2009, 10:32     Titel:
  Antworten mit Zitat      
Hallo,

emlmex unterstützt keine Arrays von dynamischer Größe.

Zwischen A(4,3) und A(3,1) sollte kein Unterschied sein. Eher zwischen A(4,Smile und A(3,1). Beim ersteren weiss emlmex nämlich nicht, wieviel Speicherplatz es für das Resultat reservieren soll.

Man kann die Probleme zumindest teilweise umgehen, indem man den benötigten Speicherplatz explizit vorbelegt, etwa mit

a1 = zeros(140533, 1);

Wege mit extrinsischen Funktionen würde ich, wenn es irgendwie geht, vermeiden, weil es das ganze wieder entsprechend langsam macht.
Die Indizierung
Code:
treff=treff(1:t,:);
würde ich (wenn möglich)noch vor der MEX-Funktion (z.B. beim Aufruf) machen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 18.07.2009, 19:53     Titel:
  Antworten mit Zitat      
Danke für die Antwort !

Ich könnte auch Arrays fester Grösse einlesen lassen. Aber wie mache ich dann emlmex klar, dass es sich um ein statisches Array handelt ?
Dass echt nur ( ... , 2 ) zu Problemen führt und ( ... , 1 ) nicht, fand ich auch schon komisch (ich hab versch. while-Schleifen, in der ersten wird die erste Spalte ausgelesen, in der zweiten dann erste und zweite. Dachte am Anfang, der Comp hängt sich an der log. Verknüpfung auf, aber das war's nicht - der Fehler kommt nur, wenn etwas ausser der ersten Spalte abgefragt wird, Zeilennummer scheint keine Rolle zu spielen - wenn der Comp. aber eh nur Skalare erwartet... Shocked )
Könnte das ein Bug sein (Vista 64 & Matlab 2008a)? Die ganze Sache auf die Funktionen zu verteilen war eher ne Verzweiflungstat...
Vielleicht hängts auch nur daran, dass ich kein
Code:
benutzt habe Laughing

treff ist der Ausgabevektor, die Abtrennung der nicht benötigten Teile kann ich dann auch im Matlab/M machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2009, 09:20     Titel:
  Antworten mit Zitat      
Ich war mir zugegebenermassen auch nicht 100% im klaren, wie man mit vektorartigen Eingabeargumenten umgeht. Hier ist ein Beispiel:

Code:
function [x1, x2] = emltest(x)
%#eml

x1 = x(:,1);
x2 = x(:,2);


Kompilieren und Aufruf:

Code:
emlmex emltest -eg {zeros(20,2)}
x = rand(20,2);
[x1, x2] = emltest(x)


Für weitere Hilfe mit Deinem Code müsste ich den wohl tatsächlich sehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 20.07.2009, 16:35     Titel:
  Antworten mit Zitat      
Danke, danke, danke !
mit dem -eg geht's !
Very Happy
Eigentlich kann ich das Komplilieren auch im Skript machen, wenn ich denn dann weiss, wie gross die Eingangsmatritzen sind, oder?
Dann kann ich auf's Erweitern verzichten, weil das evtl. Probleme aufwerfen würde (schon allein performancetechnische)...
Gehört das emlmex zu dem Extra-C-Paket oder ist dies im Grundpaket drinnen ?
nochmals danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2009, 16:44     Titel:
  Antworten mit Zitat      
Zitat:
Eigentlich kann ich das Komplilieren auch im Skript machen, wenn ich denn dann weiss, wie gross die Eingangsmatritzen sind, oder?

Theoretisch ja, nur dass es dann eben zur Laufzeit dauert. Je nach Programmkomplexität braucht emlmex ja doch ein wenig.

Zitat:
Gehört das emlmex zu dem Extra-C-Paket oder ist dies im Grundpaket drinnen ?


Siehe
http://www.mathworks.com/access/hel.....olbox/eml/gs/brtlio3.html
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 20.07.2009, 22:30     Titel:
  Antworten mit Zitat      
Das Kompliliern dauert maximal ne Minute, also ist so alles in Butter.

Danke für den Link!
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.