0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用GPT写个mexFunction

MATLAB 来源:MATLAB 2024-01-25 10:10 次阅读

| 作者:老朽路人甲

最近有位用户想在 MATLAB 里用 m 代码实现一个将某个图形窗口最大化显示的功能,问我们有没有 MATLAB 函数支持这个。

大伙儿找了一圈没找到,老朽就建议不如用 C 写个 mexFunction,交给 MATLAB 调用就好了——虽然用 Python 也能写,MATLAB 调用 Python 更方便,但那得安装和配置 Python 环境,不太友好。

这年头自己写两行 C 代码实现这么简单的功能并不难,但既然有了 GPT,何不偷个懒。于是有了以下对话:

【内心 OS】能行么,还是先试试简单的

我:我想用 C 语言基于 windows api 实现这样一个功能,获得一个桌面上的带"Figure 1"具体标题的窗口,并将这个窗口最大化,能帮我写一个代码吗?

GPT:要实现这个功能,你可以使用 Windows API 中的 FindWindow 函数来查找窗口,然后使用 ShowWindow 函数来最大化它。下面是一个简单的示例代码,演示了如何查找标题为"Figure 1"的窗口并将其最大化:

#include 
#include 

int main() {
    // 查找窗口句柄
    HWND hwnd = FindWindow(NULL, TEXT("Figure 1"));
    if (hwnd == NULL) {
        printf("无法找到窗口
");
        return 1;
    }

    // 最大化窗口
    ShowWindow(hwnd, SW_MAXIMIZE);

    return 0;
}


这段代码首先尝试找到标题为"Figure 1"的窗口。如果找到了,就使用 ShowWindow 函数将其最大化。SW_MAXIMIZE 是一个宏,用于指示 ShowWindow 函数将窗口最大化。

请注意,这段代码假设窗口标题完全匹配"Figure 1"。如果窗口标题包含其他文本,那么你需要修改 FindWindow 函数的第二个参数以匹配实际的窗口标题。

还要注意的是,为了能够编译和运行这个程序,你需要在支持 Windows API 的环境中进行,比如使用 Microsoft Visual Studio 或者其他支持 Windows 开发的 IDE。

在运行此代码之前,请确保你有足够的权限来操作其他应用程序的窗口,因为某些安全设置可能会阻止你的程序执行这些操作。

【内心 OS】哟,看起来能工作呢,先不编译运行了,再试试复杂点的

我:谢谢,我想将"Figure 1"作为命令行的输入参数传进去,从而让这个程序可以获得任何指定标题的窗口并将其最大化,或者最小化。我想让最大化、最小化也作为输入参数,可以帮我修改一下程序吗?

GPT:当然可以。以下是修改后的C语言程序,它接受两个命令行参数:第一个是窗口标题,第二个是操作类型(最大化或最小化)。

#include #include #include int main(int argc, char *argv[]) { if (argc != 3) { printf("用法: %s <窗口标题> ", argv[0]); return 1; } // 获取命令行参数 LPCSTR windowTitle = argv[1]; char *operation = argv[2]; // 查找窗口句柄 HWND hwnd = FindWindow(NULL, windowTitle); if (hwnd == NULL) { printf("无法找到窗口: %s ", windowTitle); return 1; } // 根据命令行参数最大化或最小化窗口 if (strcmp(operation, "max") == 0) { ShowWindow(hwnd, SW_MAXIMIZE); } else if (strcmp(operation, "min") == 0) { ShowWindow(hwnd, SW_MINIMIZE); } else { printf("无效操作: %s ", operation); printf("操作必须是 'max' 或 'min' "); return 1; } return 0; }


这个程序首先检查命令行参数的个数是否正确。如果不正确,它会打印出正确的用法并退出。

然后,它读取窗口标题和操作类型参数。使用 FindWindow 函数查找窗口,如果找到了,根据操作类型参数调用 ShowWindow 函数以最大化或最小化窗口。

要编译和运行这个程序,你需要将它保存为 .c 文件,并在支持 Windows API 的环境中进行编译和运行。例如,在命令行中,你可以这样运行程序:

your_program.exe "Figure 1" max 或者

your_program.exe "Figure 1" min


上面的 your_program.exe 是编译后的程序名称,"Figure 1"是你想要操作的窗口标题, max 和 min 分别表示最大化和最小化窗口的操作。

【内心 OS】太可以了,让我编译运行一下

d0bb0366-baa0-11ee-8b88-92fbcf53809c.png

【内心OS】居然零错误!

d0bf2d92-baa0-11ee-8b88-92fbcf53809c.png

【内心OS】直接能工作!

【内心 OS】厉害,它能直接给我生成 mexFunction 吗?试试!

我:你能把这个转换成 MATLAB 的 mexFunction 实现吗?

GPT:要将这个功能转换成 MATLAB 的 mexFunction,你需要使用 MATLAB 的 MEX API 来编写一个 C 函数,然后在 MATLAB 中编译它。以下是一个示例代码,它展示了如何创建一个 mexFunction 来实现相同的功能:

首先,你需要创建一个 C 源文件,例如 window_operations.c,代码如下:

#include "mex.h" #include #include void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // 检查输入参数数量 if (nrhs != 2) { mexErrMsgIdAndTxt("window_operations:invalidNumInputs", "需要两个输入参数:窗口标题和操作类型。"); } // 获取输入参数 char *windowTitle = mxArrayToString(prhs[0]); char *operation = mxArrayToString(prhs[1]); if (windowTitle == NULL || operation == NULL) { mexErrMsgIdAndTxt("window_operations:inputConversionFailed", "输入参数转换失败。"); } // 查找窗口句柄 HWND hwnd = FindWindow(NULL, windowTitle); if (hwnd == NULL) { mexErrMsgIdAndTxt("window_operations:windowNotFound", "无法找到窗口: %s", windowTitle); } // 根据输入参数最大化或最小化窗口 if (strcmp(operation, "max") == 0) { ShowWindow(hwnd, SW_MAXIMIZE); } else if (strcmp(operation, "min") == 0) { ShowWindow(hwnd, SW_MINIMIZE); } else { mexErrMsgIdAndTxt("window_operations:invalidOperation", "无效操作: %s", operation); } // 释放分配的内存 mxFree(windowTitle); mxFree(operation); }然后,你需要在 MATLAB 中编译这个源文件。打开 MATLAB,然后在命令窗口中运行以下命令来编译 window_operations.c:

mex window_operations.c
编译成功后,你会得到一个名为 window_operations.mexw64(在 64 位 Windows 上)的可执行文件。现在你可以在 MATLAB 中像调用普通函数一样调用这个 MEX 函数了:
window_operations('Figure 1', 'max');
或者
window_operations('Figure 1', 'min');

这将分别最大化或最小化标题为"Figure 1"的窗口。

请确保在编译和运行 MEX 文件之前,你的 MATLAB 安装了支持 C 语言的 MEX 编译器,并且你有足够的权限来操作其他应用程序的窗口。

【内心 OS】这都会!不光生成了代码,还告诉了老朽怎么在 MATLAB 里编译它,以及怎么调用,太厉害了,跑一下!

>> mex window_operations.c
Building with 'Microsoft Visual C++ 2019 (C)'.
MEX completed successfully.
>> window_operations('MATLAB R2023b', 'max');
>>

一次性成功!连 debug 的机会都不给!

【结语】还能说什么!抓紧用起来,不然失业了!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    175

    文章

    2922

    浏览量

    228441
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14177
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83467
  • GPT
    GPT
    +关注

    关注

    0

    文章

    300

    浏览量

    14868

原文标题:请 GPT 帮我写个 mexFunction

文章出处:【微信号:MATLAB,微信公众号:MATLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问TC234芯片中的CCU6 , GTM, GPT12中的pwm区别是什么?

    TC234芯片中的CCU6 , GTM(TIM, TOM), GPT12中pwm捕获与产生的PWM有什么区别?什么时候CCU6, GTM或GPT12的方式捕获Pwm?什么时候CCU
    发表于 02-05 06:38

    使用TC21x的GPT实现1m计时器执行定时任务,怎么配置GTM和GPT

    专家们好,我想使用TC21x的GPT实现1m计时器执行定时任务,不知道怎么配置GTM和GPT
    发表于 02-06 06:47

    TC275如何设定GPT模块分频?

    在illd里没找到相关函数,请问各位高手如何设定GPT模块分频,谢谢。
    发表于 02-22 07:37

    Verilog HDL写个蜂鸣器小程序

    本帖最后由 starnsky 于 2014-8-8 14:42 编辑 Verilog HDL写个CPLD的蜂鸣器控制小程序,实现对蜂鸣器响声次数的控制,向大家求教了!
    发表于 08-08 14:40

    GPT定时器​基本知识详解

    一、GPT定时器​ 以前的延时,通过空指令进行延时,不准确。当修改时钟频率后,才延时就会有很大的变动。而6ULL的GPT是一个高精度定时器装置。​ GPT是一个32bit的向上计数器
    发表于 12-07 12:10

    EPIT定时器与GPT定时器简单介绍

    EPIT定时器与GPT定时器简单介绍一、EPIT定时器1、EPIT定时器简介2、EPIT定时器寄存器二、GPT定时器1、GPT定时器简介2、GPT定时器寄存器cortex-A7拥有2个
    发表于 01-06 07:46

    GPT高精度延时定时器简介

    Linux NXP (I.MX6ULL) GPT高精度延时定时器0、GPT 定时器简介1、GPT 定时器特性如下:2、GPT 定时器的可选时钟源如下图所示:3、
    发表于 01-12 06:46

    GPT2模块的相关资料推荐

    定时器 GPT2 模块这次简单介绍下GPT2GPT2 模块框图**捕捉/重载寄存器 CAPREL 可用来捕捉定时器 T5 的值, 或者重载定时器 T6。 同时, 特殊模式促进两种功能对寄存器
    发表于 02-22 07:57

    IMX6ULL中如何使用GPT2的capture1捕捉外部PWM信号?

    参考time.c重写了一个驱动,主要内容如下:// 获取中断 gpt -> irq = platform_get_irq (pdev, 0 ); 如果( gpt -> irq <
    发表于 04-14 06:36

    用TensorFlow写个简单的神经网络

    这次就用TensorFlow写个神经网络,这个神经网络写的很简单,就三种层,输入层--隐藏层----输出层;
    的头像 发表于 03-23 15:37 5008次阅读
    用TensorFlow<b class='flag-5'>写个</b>简单的神经网络

    GPT系列的“高仿” 最大可达GPT-3大小 自主训练

    虽然GPT-3没有开源,却已经有人在复刻GPT系列的模型了。 例如,慕尼黑工业大学的Connor Leahy,此前用200个小时、6000RMB,复现了GPT-2。 又例如,基于150亿参数
    的头像 发表于 02-13 09:24 2679次阅读

    转载:DIY:给单片机写个实时操作系统内核!

    转载:DIY:给单片机写个实时操作系统内核!
    发表于 11-13 19:36 1次下载
    转载:DIY:给单片机<b class='flag-5'>写个</b>实时操作系统内核!

    网站总被攻击?写个自动封禁IP的脚本给你

    个人网站总被攻击?写个自动封禁IP的脚本给你!
    的头像 发表于 01-29 11:44 876次阅读

    Python-写个可转债分析器

    用Python写个可转债分析器
    的头像 发表于 02-16 15:13 973次阅读
    Python-<b class='flag-5'>写个</b>可转债分析器

    GPT/GPT-2/GPT-3/InstructGPT进化之路

    在预训练阶段,GPT 选择 transformer 的 decoder 部分作为模型的主要模块,transformer 是 2017年 google 提出的一种特征抽取模型,GPT 以多层 transformer 堆叠的方式构成了整个预训练模型结构。
    的头像 发表于 03-03 11:14 3163次阅读