Matlab C 函数库的结构体——mxArray
应老师要求,使用需要使用c实现对matlab动态库的调用,这里面主要用到一个mxArray数据结构,下面介绍一下。以下内容主要参考dalao博客《[Matlab] MxArray 与 MwArray 使用区别》Matlab C 函数库的结构体——mxArray引言MxArray与MwArray的区别声明:销毁变量传递引言在外部编程语言与matlab的交互中,Array是最单元的交互元素,怎么都绕不
·
应老师要求,使用需要使用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
更多推荐
所有评论(0)