matlab与c混编 matlab调用dll

简介:matlab与c混编时,调用动态库
配置:
vs2019
matlab R2019b

编写混编文件

  • 生成动态库
  • 在生成动态库后,我们拥有了add.h、Add.lib、Add.dll这三个文件。
  • 新建一个文件夹,将add.h、Add.lib、myAdd.c放在一起。其中myAdd.c为matlab与c混编的文件,代码如下。
// myAdd.c
#include "mex.h"
#include "matrix.h"
#include "add.h"

#pragma comment(lib,"Add.lib")

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
  // 判断输入参数的数量
  if (nrhs != 2) {
    mexErrMsgTxt("error: input number must be 2.");
  }
  // 判断输出参数的数量
  if (nlhs != 1) {
    mexErrMsgTxt("error: output number must be 1.");
  }
  // 判断两个输入参数的大小是否一致。prhs[0]为第一个输入参数,prhs[1]为第二个输入参数
  if (mxGetM(prhs[0]) != mxGetM(prhs[1]) || mxGetN(prhs[0]) != mxGetN(prhs[1])) {
    mexErrMsgTxt("error: inputs size unequal.");
  }
  int rows = mxGetM(prhs[0]);    // 获取输入参数的行数
  int cols = mxGetN(prhs[0]);    // 获取输入参数的列数
  // 根据输入参数的大小分配内存
  float** a = (float**)malloc(rows * sizeof(float*));
  float** b = (float**)malloc(rows * sizeof(float*));
  float** c = (float**)malloc(rows * sizeof(float*));
  for (int ri = 0; ri < rows; ++ri) {
    a[ri] = (float*)malloc(cols * sizeof(float));
    b[ri] = (float*)malloc(cols * sizeof(float));
    c[ri] = (float*)malloc(cols * sizeof(float));
    for (int ci = 0; ci < cols; ++ci) {
      // 将输入参数的值分别赋给a、b
      // mxGetPr(prhs[0])获取第一个参数的指针,尽管prhs[0]是数组,但是它的存储空间是连续的,这与c/c++中的二级指针不同
      a[ri][ci] = *(mxGetPr(prhs[0]) + ri * cols + ci);   
      b[ri][ci] = *(mxGetPr(prhs[1]) + ri * cols + ci);
    }
  }
  // 计算
  add(a, b, c, rows, cols);
  // 为输出参数分配内存
  plhs[0] = mxCreateDoubleMatrix(rows, cols, mxREAL);
  // 将c的值赋给输出参数
  for (int ri = 0; ri < rows; ++ri) {
    for (int ci = 0; ci < cols; ++ci) {
      *(mxGetPr(plhs[0]) + ri * cols + ci) = c[ri][ci];
    }
  }
}

matlab编译

接着,在matlab中进行编译。

  • 首先,进行MEX配置。在matlab的命令行窗口中输入 mex -setup
    matlab与c混编 matlab调用dll_第1张图片
  • 选择 Microsoft Visual C++ 2019 © 编译器。如果选择 MinGW64 Compiler © 编译器会出现编译失败,将无法识别"_declspec(dllexport)"动态库的关键字。
  • 将matlab的当前文件夹设置为包含有add.h、Add.lib、myAdd.c的文件夹
  • 在matlab的命令行窗口中输入 mex myAdd.c
    在这里插入图片描述
  • 编译成功,生成 myAdd.mexw64 文件

matlab与c混编 matlab调用dll_第2张图片

  • 新建文件夹,将myAdd.mexw64、Add.dll文件放置其中。在此文件夹中新建 test.m 文件用于测试
    matlab与c混编 matlab调用dll_第3张图片
% test.m
a=[1,2,3
    4,5,6];
b=[1,1,1
    1,1,1];
c=myAdd(a,b)
  • 运行 test.m,得到结果如下,证明matlab与c混编成功
>> test

c =

     2     3     4
     5     6     7

代码

完整代码:C/C++、matlab、python:生成c动态库,matlab、python调用
不想使用积分下载的,可以私信邮箱,直接发你

你可能感兴趣的:(C++,matlab,c语言,开发语言)