MATLAB R2020b进行函数编程时使用load载入数据应注意,这些数据中的变量名不能与MATLAB已有的函数名相同

关键词: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时指定要载入的变量名尝试。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值