可以运行C' C'内部调用matlab函数的二进制文件?

时间:2017-04-21 10:44:39

标签: c++ c matlab mex engopen

我编写了一个C程序,它使用engOpen打开MATLAB并在MATLAB中评估一些值。我通过链接所需的库成功编译了该代码。但是,不幸的是,在执行该二进制文件时我遇到了错误

testEngOpen.exe has stopped working.

A problem caused the program to stop working correctly. Windows will close the program and notify you if solution is available.

Stop Working

我展示了上面的图片。

我正在使用Windows 8.1 Pro,64位RAM和MATLAB 2017a。

但是,我通过在MATLAB中生成该代码的MEX二进制文件来成功运行该程序。并成功执行了该MEX文件。

是否可以编译&运行一个使用matlab函数而不生成MEX文件的c代码?

/*
 *  engwindemo.c
 *
 *  This is a simple program that illustrates how to call the MATLAB
 *  Engine functions from a C program for windows
 *
 *      Note: 
 *      Use the Lcc or Microsoft Visual C++ compiler to build engwindemo.exe. 
 *      The source code in engwindemo.c is not supported for other compilers.
 *
 * Copyright 1984-2003 The MathWorks, Inc.
 */
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"

#define BUFSIZE 256

static double Areal[6] = { 1, 2, 3, 4, 5, 6 };

int PASCAL WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpszCmdLine,
                    int       nCmdShow)

{
    Engine *ep;
    mxArray *T = NULL, *a = NULL, *d = NULL;
    char buffer[BUFSIZE+1];
    double *Dreal, *Dimag;
    double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    /*
     * Start the MATLAB engine 
     */
    if (!(ep = engOpen(NULL))) {
        MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine", 
            (LPSTR) "Engwindemo.c", MB_OK);
        exit(-1);
    }

    /*
     * PART I
     *
     * For the first half of this demonstration, we will send data
     * to MATLAB, analyze the data, and plot the result.
     */

    /* 
     * Create a variable from our data
     */
    T = mxCreateDoubleMatrix(1, 10, mxREAL);
    memcpy((char *) mxGetPr(T), (char *) time, 10*sizeof(double));

    /*
     * Place the variable T into the MATLAB workspace
     */
    engPutVariable(ep, "T", T);

    /*
     * Evaluate a function of time, distance = (1/2)g.*t.^2
     * (g is the acceleration due to gravity)
     */
    engEvalString(ep, "D = .5.*(-9.8).*T.^2;");

    /*
     * Plot the result
     */
    engEvalString(ep, "plot(T,D);");
    engEvalString(ep, "title('Position vs. Time for a falling object');");
    engEvalString(ep, "xlabel('Time (seconds)');");
    engEvalString(ep, "ylabel('Position (meters)');");

    /*
     * PART II
     *
     * For the second half of this demonstration, we will create another mxArray
     * put it into MATLAB and calculate its eigen values 
     * 
     */

     a = mxCreateDoubleMatrix(3, 2, mxREAL);         
     memcpy((char *) mxGetPr(a), (char *) Areal, 6*sizeof(double));
     engPutVariable(ep, "A", a); 

     /*
     * Calculate the eigen value
     */
     engEvalString(ep, "d = eig(A*A')");

     /*
     * Use engOutputBuffer to capture MATLAB output. Ensure first that
     * the buffer is always NULL terminated.
     */
     buffer[BUFSIZE] = '\0';
     engOutputBuffer(ep, buffer, BUFSIZE);

     /*
     * the evaluate string returns the result into the
     * output buffer.
     */
     engEvalString(ep, "whos");
     MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR) "MATLAB - whos", MB_OK);

     /*
     * Get the eigen value mxArray
     */
     d = engGetVariable(ep, "d");
     engClose(ep);

     if (d == NULL) {
            MessageBox ((HWND)NULL, (LPSTR)"Get Array Failed", (LPSTR)"Engwindemo.c", MB_OK);
        }
    else {      
        Dreal = mxGetPr(d);
        Dimag = mxGetPi(d);             
        if (Dimag)
            sprintf(buffer,"Eigenval 2: %g+%gi",Dreal[1],Dimag[1]);
        else
            sprintf(buffer,"Eigenval 2: %g",Dreal[1]);
        MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR)"Engwindemo.c", MB_OK);
        mxDestroyArray(d);
    } 

    /*
     * We're done! Free memory, close MATLAB engine and exit.
     */
    mxDestroyArray(T);
    mxDestroyArray(a);

    return(0);
}

这是我用gcc编译器编写和编译的。但在执行时面临一些问题?

0 个答案:

没有答案