You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确向MEX函数传递输入参数并获取返回的输出结果?

问题原因与修复方案

1. 输入参数传递错误根因

mxGetScalar 固定返回double类型值,如果你在Matlab侧传入的index是枚举类非double类型,直接强转成自定义枚举new_type就会出现值解析错误。你后续将输入转成double再传入的处理是正确的,也可以在MEX代码内增加类型校验逻辑,避免传参类型错误导致异常。

2. Flag输出异常根因

原代码存在明显逻辑错误:

  • 先创建了plhs[0]的输出矩阵,此时矩阵内初始值为0,你把这个初始0值赋值给了Flag变量
  • 后续调用src_Function更新了Flag变量的值,但没有把更新后的Flag值写回plhs[0]对应的内存地址,所以Matlab侧永远只能读到初始的0值。

修正后的完整MEX代码

#include "mex.h"
#include "math.h"
#include "source.c"

#define MXCLASS mxSINGLE_CLASS 

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{   
    /* 输入输出参数校验(可选,建议添加避免非法调用崩溃) */
    if(nrhs != 1) {
        mexErrMsgIdAndTxt("MyMEX:InvalidInput", "仅需传入1个输入参数");
    }
    if(nlhs != 2) {
        mexErrMsgIdAndTxt("MyMEX:InvalidOutput", "需要指定2个输出参数");
    }
    if(!mxIsDouble(prhs[0]) || mxGetNumberOfElements(prhs[0]) != 1) {
        mexErrMsgIdAndTxt("MyMEX:InputTypeError", "输入参数必须为标量double类型");
    }
    
    /* 变量定义 */
    new_type Index;
    INTEGER Flag;
    FLOAT *Result;
    INTEGER *FlagPtr; // 用于指向输出Flag的内存地址
    
    /* 读取输入参数 */
    Index = (new_type)mxGetScalar(prhs[0]);
    
    /* 创建输出矩阵 */
    plhs[0] = mxCreateNumericMatrix(1,1,mxINT16_CLASS,mxREAL); 
    plhs[1] = mxCreateNumericMatrix(1,1,MXCLASS,mxREAL); 
    
    /* 获取输出矩阵的内存指针 */
    FlagPtr = (INTEGER *)mxGetPr(plhs[0]);
    Result = (FLOAT *)mxGetPr(plhs[1]);
    
    /* 调用子例程,直接把Flag值写入输出内存地址 */
    *FlagPtr = src_Function(Index, Result);
}

Matlab调用说明

你调整后的调用方式可以继续使用:

[flag,result] = feval('src_Function_mex',double(index));

如果添加了代码里的输入类型校验逻辑,传参类型错误时会直接抛出明确提示,无需再猜测参数解析错误问题。

内容的提问来源于stack exchange,提问作者e_frost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:24:02