matlab报错:尝试将 SCRIPT xxx 作为函数执行

您所在的位置:网站首页 错误使用fzero matlab报错:尝试将 SCRIPT xxx 作为函数执行

matlab报错:尝试将 SCRIPT xxx 作为函数执行

2024-04-01 03:03| 来源: 网络整理| 查看: 265

最近在跑matlab代码,今天在运行别人程序发现了一个错误,尝试将 SCRIPT xxx 作为函数执行, 这里记录自己的填坑指南,也方便自己和大家以后查阅。

1. 问题出现

在运行某代码的时出现错误, 尝试将 SCRIPT xxx 作为函数执行 如下图所示: 在这里插入图片描述

2. 猜想问题出现的可能性

经过网上的搜索,发现列举了两种可能的错误:

文件名和函数名重名所致,只需将函数重命名函数文件的第一行函数定义没有写或者编写错误,将函数定义修改规范即可

参考

尝试将 SCRIPT script 作为函数执行matlab报错:尝试将 SCRIPT xxx 作为函数执行:错误

但是经过具体的检查发现问题并不简单,因此我们比较笨的方法也是最原始的方法就是调试一下代码。因为我们这里的代码比较复杂,它是调用了两个外部工具包,即ompbox10以及ksvdbox13。关于matlab工具包的添加,可以参考给Matlab添加工具箱Toolbox的方法(有截图详细讲解)。 所以这里猜想问题可能出现在这两个工具包中。

3. 问题的解决 3.1 问题进一步定位

经过上面的分析,我们首先定位到程序出错的地方,然后一级一级查看函数定义,最后发现我们调用函数是这番模样。 在这里插入图片描述 what? 有点吃惊, 这个函数实现竟然全部被注释了!!那么这个im2colstep具体是在哪里实现了?别急,我们在**.m**文件旁边发现了一个 .c 文件,猜想 我们这个函数其实底层使用c语言实现的! 所以,接下来我们的思路也是很清晰的,那就是首先先要了解matlab是如何调用c语言的。

3.2 了解matlab中调用c程序 3.2.1 初步了解

matlab默认的程序文件是.m文件,但有很多情况下需要用matlab调用C语言程序,归纳起来有以几种情况:

matlab程序中的某模块非常耗时,改用C语言编写可以提高执行速度。现有成熟算法已经用C语言编写完成,但是matlab程序需要调用其中的某一算法,但不想改写成为.m程序从.m程序可以直接获取源代码,为了保护知识产权,作者希望只提供接口,和库函数,供使用者调用。类似于Windows系统动态链接库(.dll)

具体的大家可以参考这一篇博客做更详细的了解matlab调用C语言程序,MEX文件使用方法,matlab与C混合编程。这里也不做过多的解释了。

3.2.2 配置matlab编译器

按照作者的介绍,我们首先应该需要配置matlab编译器,如何配置呢?参考Matlab安装 MinGW-w64 编译器的方法

在matlab工作区中输入以下命令行: mex -setup

结果出现: 在这里插入图片描述 既然没有那我们就安装一下呗。大概经历以下几个步骤:

下载MinGW-w64 C++编译器(下载地址,安装时注意选择32位还是64位的,因为我的机器是64位的,所以需要下载64位的!如果你是32位机器,那么就下载32位的!) 在这里插入图片描述 第一个TDM32 MinGW针对32位机器, 第二个TDM64 MinGW-w64是64位机器。

(1)安装时注意最好按照默认路径安装,否则后面使用时可能会报错

(2)安装时点create,窗口下面的勾选框要选上

设置其路径到环境变量 电脑->属性->高级系统设置->环境变量->系统变量->添加

在这里插入图片描述

在MATLAB命令行内运行命令setenv(‘MW_MINGW64_LOC’,folder),folder为TDM-GCC的安装位置,这里是'C:\TDM-GCC-64'要加单引号;

重启matlab即可使用(这里最好重启一下电脑!我是重启了matlab没有作用)

经过上面的操作,我们是完成编译器的安装,然后在matlab的命令行中,输入mex -setup,这时候就出现编译器已经安装完毕了。

在这里插入图片描述

3.2.3 在matlab中编译c代码

在完成了之前的编译器的配置之后,我们接下来就开始编译我们的c代码。那么如何编译了?

我们首先切换当前的目录, 进入到需要编译.c程序的目录。使用mex ***.c 命令,等到编译成功之后你会发现在当前的目录下,生成.mexw64后缀名的文件。 在这里插入图片描述更新matlab的工具箱路径缓存(这一步很重要,要不然之前的生成的.mexw64文件并没有发生作用。) 这里以matlab2015为例, 在主页->预设->常规(这里每生成一次.mexw64就需要生成更新一次!) 在这里插入图片描述 这时候,我们再次运行一下主程序,发现 在这里插入图片描述 表示我们上个函数的错误已经解决了,接下来我们就需要按照上面的方法,将每一个函数生成对应的.mexw64文件。然后程序就没有错误了: 在这里插入图片描述 4. 反思

其实,我们观察工具包的目录的时候,其实是发现了.mexw32程序,到这里我们终于问题尝试将 SCRIPT xxx 作为函数执行的原因是:其实这个原生程序在32位机器是可以跑的通的,原作者也是在32位机器写的。只是现在我们换成了64位机器,却没有提供相应的.mexw64文件,导致matlab不能解析.c文件。好吧,暂时先写到这里,后面的话如果有时间的话,把这两个工具包的32/64位版本都传到我的github上了。感谢其他博主的分享。

ksvdbox13ompbox10

这个应该是今年最后一个博客了,让我们迎接2020,哈哈。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3