【问题标题】:Passing Variable from C++ to Matlab (Workspace)将变量从 C++ 传递到 Matlab(工作区)
【发布时间】:2015-10-21 05:48:37
【问题描述】:

我正在尝试将变量 z = 100 从 C++ 传递到 Matlab 以进行进一步处理(这只是一个非常简化的示例)。我基本上希望将其作为全局变量传递,以便我可以从任何 Matlab 函数访问此变量(可能发送到 Matlab 工作区)。

这是我的 C++ 代码(我在 C++ 中使用 Matlab 引擎):

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <iostream>
#include <math.h>
#include <fstream>
#include <stdio.h>
#include <Windows.h>
#include "engine.h"
#include <engine.h>
//#include <cmath>
#define _USE_MATH_DEFINES

#pragma comment ( lib, "libmat.lib" )
#pragma comment ( lib, "libmx.lib" )
#pragma comment ( lib, "libmex.lib" )
#pragma comment ( lib, "libeng.lib" )

using namespace cv;
using namespace std;

int main (int argc, char* argv[])
{
    Engine *ep = engOpen(NULL);
    int z;
    mxArray *z_array = mxCreateDoubleMatrix(1,1,mxREAL);
    double *pz = mxGetPr(z_array);
    z = 100;
    engPutVariable(ep, "z", z_array);

    engClose(ep);

    return 0;
}

当这段代码执行完毕后,我打开 Matlab 并尝试访问变量z,但它不存在。我在这里缺少什么吗? (我也试过在engPutVariable 之后插入engEvalString(ep, "global z; disp(z);");,但这没有帮助。

如果您能给我提供任何见解,我将不胜感激。谢谢!

【问题讨论】:

    标签: c++ matlab variables parameter-passing


    【解决方案1】:

    您的代码对我来说看起来不错。 通过编写 engClose(ep);您关闭 Matlab 引擎,因此变量 z 将在 Matlab 会话中消失。

    编辑:通过查看您的代码,我注意到 z 没有受到 z_array 的影响。所以试试下面的代码

    mxArray *z_array = NULL;
    double z[1] = {100};
    z_array = mxCreateDoubleMatrix(1, 1, mxREAL);
    memcpy((char *) mxGetPr(z_array), (char*) z, sizeof(double));
    engPutVariable(ep, "z", z_array);
    mxDestroyArray(z_array);
    

    【讨论】:

    • 感谢您的回复!我最初也是这么想的;但是,如果我删除 engClose(ep); Matlab 命令窗口确实保持打开状态,但如果我启动 Matlab,工作区或其他任何地方都没有名为 z 的变量。
    • 啊,是的,我明白了 - 现在从命令窗口中返回 z = 100。谢谢!但是,有没有办法从 Matlab 函数中访问这个值?当我打开 Matlab 时,工作区中没有 z 值。
    • 我不确定是否理解您的问题,如果您关闭 Matlab 会话,z 也会消失。为了从 Matlab 函数访问工作区,您可以使用命令 evalin。例如:z = evalin('base','z');
    • 对不起,我会试着澄清一下——运行上面的代码只是通过 Matlab 引擎打开一个命令窗口。它允许您通过 C++ 运行 Matlab 命令,但实际上并没有完全打开 Matlab。我实际上并不想从我的 C++ 程序运行 Matlab 命令 - 我只想将一个变量“z”从 C++ 传递给 Matlab,以便我的 Matlab 函数可以根据需要使用它。
    • 通过创建一个新的 Matlab 会话,您将无法将您的变量传递给另一个 Matlab 会话。所以你必须为你的函数和你的变量 z 只使用一个 Matlab 会话,否则我不建议使用 Matlab 引擎来传递你的变量,
    猜你喜欢
    • 2020-10-10
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多