|
|
Der Umgang mit emlmex - von M zu C |
|
Andy386 |
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 18.07.2009, 06:44
Titel: Der Umgang mit emlmex - von M zu C
|
|
|
|
|
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
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:
wieder was gelernt, aber bei der Deklaration vom S ist wieder ein subsref drinnen! Ein Teufelskreis.
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.... )
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 ??
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 18.07.2009, 10:32
Titel:
|
|
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, 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
würde ich (wenn möglich)noch vor der MEX-Funktion (z.B. beim Aufruf) machen.
Grüße,
Harald
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 18.07.2009, 19:53
Titel:
|
|
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... )
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
benutzt habe
treff ist der Ausgabevektor, die Abtrennung der nicht benötigten Teile kann ich dann auch im Matlab/M machen.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 20.07.2009, 09:20
Titel:
|
|
Ich war mir zugegebenermassen auch nicht 100% im klaren, wie man mit vektorartigen Eingabeargumenten umgeht. Hier ist ein Beispiel:
Kompilieren und Aufruf:
Für weitere Hilfe mit Deinem Code müsste ich den wohl tatsächlich sehen.
Grüße,
Harald
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 20.07.2009, 16:35
Titel:
|
|
Danke, danke, danke !
mit dem -eg geht's !
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.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.448
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 20.07.2009, 16:44
Titel:
|
|
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
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 20.07.2009, 22:30
Titel:
|
|
Das Kompliliern dauert maximal ne Minute, also ist so alles in Butter.
Danke für den Link!
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|