关键词:MATLAB、MATLAB R2020b、load、载入数据、函数、bug、漏洞、编程、变量名
摘要
MATLAB R2020b环境下编写一个函数时,若需要使用load函数载入数据则需要注意,这些数据中的变量名不能与MATLAB已有的函数名相同,否则,这些同名的变量不能成功载入到函数的工作区中。
前言
MATLAB R2020b环境下,编写一个函数,若使用load函数载入数据,很有可能会出现bug。
MATLAB R2020b环境下编写函数
保存变量数据
DataSave.m文件里的代码如下:
pattern=zeros(1,3); % 此时pattern为1*3的数组
save('Data.mat','pattern')
运行结果如下图所示:
运行DataSave.m文件可保存pattern变量,此变量为1*3数组。
载入数据,发现bug
LoadAndOutput.m文件里的代码如下:
function [lengthOfPa] = LoadAndOutput() % 输出值为3表正确运行
load('Data.mat'); % 这一句在R2020b运行会出现Bug
% load('Data.mat','pattern'); % 这一句在R2020b运行不会出现Bug
lengthOfPa = length(pattern); % pattern为1*3数组,故其length值应为3
a=pattern; % 看看pattern究竟是什么东西
end
运行结果如下图所示:
由于pattern为1*3数组,故“pattern”的length值应为3,但其输出结果为1,问题出现了。
在第六行前加断点再运行,看看LoadAndOutput函数的工作区情况。如下图:
这里很有意思。工作区的pattern显示正常,为1*3的数组,表示数据成功导入到工作区中。但其lengthOfPa值竟然为1,而且a为1*1pattern的数据!有点奇怪吧,点开a变量,如下图,显示为一个双引号“”。
关闭a变量,将鼠标分别移动至第五行的pattern和a时,更神奇的地方出现了。下图为鼠标移至pattern处:
下图为鼠标移至a处:
这赋值操作很有问题,右边是1*3double数组,左边竟然是1*1pattern。
看看问题出现在哪。
MATLAB R2020b环境下的命令行窗口里运行
在命令行窗口中输入pattern,按回车,如下图。
pattern输出的是1*3数组。这说明在命令行窗口里是没问题的,pattern没有出错。
MATLAB R2017b环境下运行函数
刚好电脑之前装了MATLAB R2017b,试试,如下图
(R2020b和R2017b编译器的编码格式不同,所以这里中文注释显示乱码。)
运行LoadAndOutput.m函数,没有出错,结果输出3。表示在MATLAB R2017b环境下,没有上述问题,pattern没有出错。
MATLAB R2020b环境下直接运行脚本
将LoadAndOutput.m函数的第一行和第六行注释掉,变成一个普通的脚本文件,运行如下图
结果输出3,正常运行。表示直接运行脚本文件,没有上述问题,pattern没有出错。
原因分析
经过一段时间尝试,心想有没有可能pattern是一个MATLAB自带的变量名或者函数,故在命令行窗口输入clear; clc; 清空工作区,输入pattern,回车。果然发现问题了,如下图
工作区清空的情况下,pattern果然有数据。可是这数据是什么东西呢,输出个1*1pattern的数据。
按F1的帮助页看看,如下图
原来是一个函数,那有没有可能MATLAB R2017b还没有引入这个函数,所以在R2017b环境下没有出错呢?帮助页滚到最下方,如下图
看到“Introduced in R2015a”,原来在R015a就已经引入了。
那这样问题其实是在MATLAB R2020b上。其实就是,R2020b版本的load函数有点问题,对于在函数内需要载入数据,若这些数据中的变量名(pattern)与自带函数名(pattern)相同,它则不能成功载入到函数的工作区中。
如何避免
使用其他版本的MATLAB
这个版本有问题,用其他版本试试,比如R2017b。
改变变量名写法
不用与函数名相同的变量名,但具体怎么做呢?我一开始用pattern作变量名,也不知pattern是一个已有的函数。当时是要完成一个模式识别课设,关于车牌识别的,用pattern表示车牌字符的标准模板数据,所以可以这样写变量名:PatternOfPlateCharacte。变量名可以大小写混用,并且多点词语,也方便阅读代码。
使用load函数时,指定需要载入的变量
load('Data.mat'); 表示将文件中的所有变量都载入到工作区中。如下图所示
若采用第二条语法的写法,如下图的第三行
指定需要载入的变量,这样调用load函数,结果输出3,没有出错,能够成功载入数据到函数的工作区中。
小结
MATLAB R2020b环境下编写一个函数时,若需要使用load函数载入数据则需要注意,这些数据中的变量名不能与MATLAB已有的函数名相同,否则,这些同名的变量不能成功载入到函数的工作区中。
MATLAB R2020b环境下,若不是在函数里使用load载入数据,而是直接运行脚本文件,或者在命令行窗口中运行,则不会出现这个bug的现象;值得注意的是,在MATLAB R2017b环境下不存在这个问题。
避免此问题,可以通过使用其他版本、注意变量名的写法、load时指定要载入的变量名尝试。