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,哈哈。

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