应老师要求,使用需要使用c实现对matlab动态库的调用,这里面主要用到一个mxArray数据结构,下面介绍一下。

以下内容主要参考dalao博客《[Matlab] MxArray 与 MwArray 使用区别

引言

在外部编程语言与matlab的交互中,Array是最单元的交互元素,怎么都绕不过去。

在matlab提供的Array接口有两个,一个是C的MxArray, 另一个是Cpp(C++)的MwArray.

MxArray与MwArray的区别

mxArray:Matlab C 函数库的结构体
mwArray:Matlab C++ 函数库中对mxArray的包装类

声明:

mxArray:    mxArray *a;
mwArray:   mwArray a;

销毁

mxArray:   mxDestroyArray a;
mwArray:   mwArray类的析构函数自动销毁对象

变量传递

mxArray: mxArray *dest_ptr =mxCreateDoubleMatrix(rows,cols, mxREAL);

          memcpy(dest_ptr,source_ptr,MAX_SIZE);

mwArray: mwArray in1(rows, cols, mxDOUBLE_CLASS, mxREAL); 

          mwArray in2(rows, cols, mxDOUBLE_CLASS, mxREAL); 

          in1.SetData(data, rows*cols); 

          in2.SetData(data, rows*cols);

比较而言, 1。mwArray的声明更简洁,不用考虑指针 2。mwArray不用手动释放内存

上代码!

matlab代码

function output = display_mat( input )

input
output = 666;

end

c代码

#include <mat.h>

#include <stdio.h>
#include <stdlib.h>

#include "mclmcrrt.h"//////
#include "mclmcr.h"  
#include "matrix.h"  
#include "mclcppclass.h"

#include "libdisplay.h"//////

void main() 
{  

    ///////////////初始化应用程序///////////////
    // Set up the application state for the MATLAB Runtime instance created in the application.
    if (!mclInitializeApplication(NULL,0)) 
    {
      printf("could not initialize the application properly");
    	  return -1;
    }
    printf("I initialize the application properly\n");
    
    
    //////////////////初始化函数库////////////////////////
    // initialize lib,这里必须做初始化!  
    if( !libdisplayInitialize())  
    {  
        printf("Could not initialize libdisplayInitialize!");  
        return -1;  
    }
    printf("I initialize libdisplayInitialize!\n");

    
    double A[] = {1, 2, 3, 4, 5, 6};
    /*
    for(int i=0;i<2;i++)
    {
	for(int j=0;j<3;j++)
	    printf(" %f", A[i][j]);
	printf("\n");
    }
    */
    for(int i=0;i<6;i++)
		printf(" %f", A[i]);
    
    mxArray *mxA = mxCreateDoubleMatrix(2, 3, mxREAL);
    mxArray *mxB = mxCreateDoubleMatrix(1, 1, mxREAL);
    
    memcpy(mxGetPr(mxA), A, sizeof(double)*2*3);
    
    mlfDisplay_mat(1,&mxB,mxA);
    
    double Result = mxGetScalar(mxB);
    printf("%f\n", Result);
    // 后面是一些终止调用的程序  
    // terminate the lib  
    libdisplayTerminate();  

    // terminate MCR  
    mclTerminateApplication();  
    
}  

运行结果:

在这里插入图片描述

注意这里细节拉满,输出的矩阵已经变换了,mxArray生成矩阵时,他先填满的列!!!

更多关于mxArray的内容请参阅:
https://ww2.mathworks.cn/help/matlab/cc-mx-matrix-library.html?s_tid=CRUX_lftnav

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐