m0_74848220 2023-03-27 16:02 采纳率: 0%
浏览 88
已结题

请教一下能人在VS中调用MATLAB绘制动态驻波

已经可以调用MATLAB,但可能代码有问题,MATLAB图像不出来,求能人赐教!

这是对vs的配置

img

img

这是C语言代码

#include "engine.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main()
{
    Engine* ep;
    mxArray* t = NULL, * l = NULL, * x = NULL, * y_fwd = NULL, * y_bwd = NULL, * y_res = NULL;
    double* t_data, * l_data, * x_data;
    double amp_fwd, freq_fwd, wavelen_fwd, amp_bwd, freq_bwd, wavelen_bwd;
    int i, j, n;

    // 连接到 MATLAB 引擎
    if (!(ep = engOpen(NULL)))
    {
        fprintf(stderr, "无法连接到 MATLAB 引擎\n");
        return EXIT_FAILURE;
    }

    // 创建 t 向量
    t = mxCreateDoubleMatrix(1, 1001, mxREAL);
    t_data = mxGetPr(t);
    for (i = 0; i < 1001; i++)
    {
        t_data[i] = i * 0.1;
    }

    // 创建 l 向量
    l = mxCreateDoubleScalar(10);
    l_data = mxGetPr(l);

    // 创建 x 向量
    x = mxCreateDoubleMatrix(1, 101, mxREAL);
    x_data = mxGetPr(x);
    for (i = 0; i < 101; i++)
    {
        x_data[i] = i * (*l_data) / 200;
    }

    // 获取用户输入参数
    printf("请输入正向波的振幅:\n");
    scanf("%lf", &_fwd);
    printf("请输入正向波的频率:\n");
    scanf("%lf", &freq_fwd);
    printf("请输入正向波的波长:\n");
    scanf("%lf", &wavelen_fwd);
    printf("请输入反向波的振幅:\n");
    scanf("%lf", &_bwd);
    printf("请输入反向波的频率:\n");
    scanf("%lf", &freq_bwd);
    printf("请输入反向波的波长:\n");
    scanf("%lf", &wavelen_bwd);
    
    // 循环每个时间点,计算波形并绘图
    for (n = 0; n < 1001; n++)
    {
        y_fwd = mxCreateDoubleMatrix(1, 101, mxREAL);
        y_bwd = mxCreateDoubleMatrix(1, 101, mxREAL);
        y_res = mxCreateDoubleMatrix(1, 101, mxREAL);
        for (j = 0; j < 101; j++)
        {
            *(mxGetPr(y_fwd) + j) = amp_fwd * sin(2 * 3.1416 * (t_data[n] * freq_fwd - x_data[j] / wavelen_fwd));
            *(mxGetPr(y_bwd) + j) = amp_bwd * sin(2 * 3.1416 * (t_data[n] * freq_bwd + x_data[j] / wavelen_bwd));
            *(mxGetPr(y_res) + j) = *(mxGetPr(y_fwd) + j) + *(mxGetPr(y_bwd) + j);
        }
        engEvalString(ep, "clf");
        engEvalString(ep, "plot(x , y_fwd , 'r', x , y_bwd , 'b', x , y_res , 'g')");
       
        engEvalString(ep, "title('波形合成')");
        engEvalString(ep, "xlabel('位置')");
        engEvalString(ep, "ylabel('振幅')");
        engEvalString(ep, "legend('正向波', '反向波', '驻波')");
        engEvalString(ep, "axis([0 10 -5 5])");
        engEvalString(ep, "M(n) = getframe()");
        mxGetPr(y_fwd); 
        mxGetPr(y_bwd);
        mxGetPr(y_res);
        mxDestroyArray(y_fwd);
        mxDestroyArray(y_bwd);
        mxDestroyArray(y_res);
    }
    // 关闭 MATLAB 引擎
    mxDestroyArray(t);
    mxDestroyArray(l);
    mxDestroyArray(x);
    engClose(ep);

    return 0;
}

然后出来的是只有坐标轴,而且在不停闪,右上角有个矩形也在闪

img

img

  • 写回答

5条回答 默认 最新

  • milaoshu1020 2023-03-27 16:10
    关注

    可以在 Visual Studio 中通过使用 MATLAB 的 COM 功能来调用 MATLAB 引擎,从而实现在 VS 中绘制动态驻波图。以下是一些参考步骤:

    1. 在 Visual Studio 中创建新的 C++ 控制台应用程序项目。
    2. 在项目中添加相应的头文件和链接库,以便能够使用 MATLAB 引擎 COM 接口连接 MATLAB 引擎。例如:
    #include <mex.h>
    #include <engine.h>
    
    #pragma comment(lib, "libmx.lib")
    #pragma comment(lib, "libeng.lib")
    
    1. 在代码中连接 MATLAB 引擎 COM 接口。
    Engine *ep; // 声明 MATLAB 引擎指针变量
    if (!(ep = engOpen(NULL))) {
        // 如果连接失败,则输出错误信息并退出程序
        fprintf(stderr, "\nUnable to connect to MATLAB Engine\n");
        return EXIT_FAILURE;
    }
    
    1. 在 MATLAB 引擎中编写绘制动态驻波图的代码,并将其打包在一个函数中。

    例如,以下示例代码使用 surf 函数绘制动态驻波图:

    function [] = drawStandingWave()
        x = linspace(-2*pi,2*pi,100);
        t = 0:0.05:10*pi;
        [X,T] = meshgrid(x,t);
        Y = sin(X).*cos(T-X);
        surf(X,Y,T);
    end
    
    1. 在 VS 中调用该 MATLAB 函数并获取返回结果。
    // 调用 MATLAB 绘图函数
    engEvalString(ep, "drawStandingWave();");
    
    // 获取绘图窗口句柄
    mxArray *hfigure = engGetVariable(ep, "gcf");
    int figureHWnd = (int)mxGetScalar(mxGetProperty(hfigure, 0, "Number"));
    
    // 设置绘图窗口为前台窗口
    SetForegroundWindow((HWND)figureHWnd);
    
    1. 最后,通过在 VS 中使用 Windows API 函数 SetForegroundWindow 将 MATLAB 绘图窗口设置为前台窗口,即可在 VS 中显示动态驻波图。

    希望这些步骤能够帮到您!

    评论

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 赞助了问题酬金15元 3月27日
  • 创建了问题 3月27日