עבור לתוכן

כתיבת DLLים ושימושם בMATLAB

Featured Replies

פורסם

אני אף פעם לא למדתי כתיבת DLLים או איך להשתמש בהם במטלב ועכשיו המנחה לפרויקט גמר שלי ביקש ממני לכתוב את הפוקציות בDLL ולקרוא להם ממטלב לשם האצת המהירות.

מישהו יכול לתת לי דוגמא קצרצרה רק בכדי להבין את הרעיון?

תודה :nixweiss:

פורסם

תפתח את המטלב תלך לעזרה

אופציה אחת היא:

MATLAB -> Extrenal Interfaces -> MATLAB interfaces to generic dll's

אם יש לך DLL מוכן.

יש עוד אפשרות:

MATLAB -> Extrenal Interfaces -> Creating C language MEX files

שזה קובץ C/C++ עם פונקצית Main מיוחדת שמהווה מעטפת לקישור עם MATLAB,

מקמפלים ב- MATLAB ואז, תלוי בגרסא של ה- MATLAB , נוצר DLL או קובץ מקביל .mex### שניתן להשתמש בו כמו פונקציה רגילה.

בעזרה יש דוגמאות ספציפיות לשליחה וקבלה של מבני נתונים שונים.

EnJoy@ :cool2:

פורסם
  • מחבר

שניסיתי לעבוד פעם אחרונה עם mex הבנתי שביטלו את זה (בגירסא 7 ומעלה), משום ששיפרו את זמן הריצה משמעותית בריצת מטלב (משהו עם JIT- Just In Time)

בכל מקרה, אני אשמח לאיזה קובץ DLL קטן, או הסבר קצר עליו.

פורסם

לא ביטלו את זה פשוט הקובצ לא נשמר כ- DLL אלא .mex$$$ שאפשר להשתמש בו רק ב- MATLAB.

גם אני די חדש בנושא (שבועיים) אבל כבר הוצאתי שתי פונקציות שעובדות.

כל פונקציה ב- C/C++ שאתה רוצה להריץ ב- MATLAB צריך פשוט לכתוב פונקצית MAIN מיוחדת בשם void mexFunction.

הדוגמא הגנרית הראשונה של MATLAB למשל:

/*

* =============================================================

* timestwo.c - example found in API guide

*

* Computational function that takes a scalar and doubles it.

*

* This is a MEX-file for MATLAB.

* Copyright © 1984-2000 The MathWorks, Inc.

* =============================================================

*/

/* $Revision: 1.1.4.15 $ */

#include "mex.h"

void timestwo(double y[], double x[])

{

y[0] = 2.0*x[0];

}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs,

const mxArray *prhs[])

{

double *x, *y;

int mrows, ncols;

/* Check for proper number of arguments. */

if (nrhs != 1) {

mexErrMsgTxt("One input required.");

} else if (nlhs > 1) {

mexErrMsgTxt("Too many output arguments");

}

/* The input must be a noncomplex scalar double.*/

mrows = mxGetM(prhs[0]);

ncols = mxGetN(prhs[0]);

if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||

!(mrows == 1 && ncols == 1)) {

mexErrMsgTxt("Input must be a noncomplex scalar double.");

}

/* Create matrix for the return argument. */

plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);

/* Assign pointers to each input and output. */

x = mxGetPr(prhs[0]);

y = mxGetPr(plhs[0]);

/* Call the timestwo subroutine. */

timestwo(y,x);

}

פשוט תכנס לעזרה ותחיל לתרגל. ;)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים