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

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

1. 问题出现

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

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

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

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

参考

  1. 尝试将 SCRIPT script 作为函数执行
  2. 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语言程序,归纳起来有以几种情况:

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

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

3.2.2 配置matlab编译器

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

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

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

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

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

3.2.3 在matlab中编译c代码

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

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

4. 反思

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

  1. ksvdbox13
  2. ompbox10

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章