• 【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(2)


    本文是调试Matlab中自带的例子,已成功。

    /*
     *    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.
     */
    /* $Revision: 1.10.4.2 $ */
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include "engine.h"
    #pragma comment( lib, "libmx.lib"  )
    //#pragma comment( lib, "libmex.lib" )
    #pragma comment( lib, "libeng.lib" )
    #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);
    }

    ------------------------------------------------------------------------------------

    ==============================================================

    注意事项:

    1)本例子在原有的代码上面加入两句话#pragma comment( lib, "libmx.lib"  )和#pragma comment( lib, "libeng.lib" )

    2)如果你建立的是win32控制台空项目虽然不和要求,但如果想运行只需要改项目属性-链接器-系统-子系统,选windows即可

    3)其他注意见-【MATLAB与C的混合编程】之【C程序调用Matlab计算引擎】(1)

  • 相关阅读:
    jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
    javascript 中的后退和前进到上下一页
    文件IO流完成文件的复制(复杂版本主要用来演示各种流的用途,不是最佳复制方案哦)
    int ,Intege,String 三者之间的转换
    servlet生成验证码代码
    jsp servlet 的 请求转发和重定向
    struts2
    SQL连接:内连接、外连接、交叉连接。
    今天参加了聚思力面试
    进程(Process)和线程(Thread)的关系和区别
  • 原文地址:https://www.cnblogs.com/caixu/p/2088990.html
Copyright © 2020-2023  润新知