之前有读者在后台留言,询问关于eval函数的使用方法,以即什么时候适合用它,今天给大家简单讨论关于eval函数的使用方法与技巧。
函数介绍
函数:eval
功能:执行文本中的 MATLAB 表达式
语法:eval(expression)
解读:此函数功能实际上是,可以将matlab里的一个字符串表达式,当作malab的命令来执行,例如字符串表达式‘x=0’,实际是字符串,但是当调用eval函数eval('x=0)命令时,matlab便执行该符串的表达式,将0赋值给变量x。
其实等价于直接输入命令 x=0该函数适用于什么场合呢?,它适用于当我们变量名特别多,不想手动赋值时,通过eval与字符串的形式,批量完成赋值。
例如,让用户手动输入输入十个数,分别赋值给n1,n2,n3...n10,此时代码如下
n1=input( '请输入n1=') n2=input( '请输入n2=') n3=input( '请输入n3=') n4=input( '请输入n4=') n5=input( '请输入n5=') n6=input( '请输入n6=') n7=input( '请输入n7=') n8=input( '请输入n8=') n9=input( '请输入n9=') n10=input( '请输入n10=')很显然改代码太机械,若有1000个变量,我们便要手动输入1000次,代码的作用是提高效率,弱化人体劳动,因此我们想到了用循环的结构编写,代码如下 for i = 1:10 n=input([ '请输入n' num2str(i) '=']); end 但是此时会存在一个问题,所有的值都在变量名n里,被一一次次替换掉,没有按照要有存在变量n1至n10,此时eval函数的功能就派上用场。
for i = 1:10
n = input(['n' num2str(i) '=']);
eval([ 'n',num2str(i),'=n'])
end
eval用于循环中是再好不过了,特别是有些变量的名字中含有有规律的数字,比如我们现在要依次把data1,data2,data3写入excel,并命名为data1.xlsx,data2.xlsx,data3.xlsx。又比如你要载入一些数据,m1.mat,m2.mat等等一直到m100.mat,普通的for语句又无法完成
于是eval函数结合for语句就体现出其价值了for i=1:100eval([ ‘load ’ num2str(i) ‘.mat’]) end
此外,在GUI应用中,eval发挥着更大作用。 例如在此系统界面中有许多绘图坐标,想为用户设置一个一键清除所有绘图数据,代码如下
axes(handles.axes1)
cla reset
set(handles.axes1,'xtick',[],'xticklabel',[])
set(handles.axes1,'ytick',[],'yticklabel',[]);box on
axes(handles.axes2)
cla reset
set(handles.axes2,'xtick',[],'xticklabel',[])
set(handles.axes2,'ytick',[],'yticklabel',[]);box on
axes(handles.axes3)
cla reset
set(handles.axes3,'xtick',[],'xticklabel',[])
set(handles.axes3,'ytick',[],'yticklabel',[]);box on
axes(handles.axes4)
cla reset
set(handles.axes4,'xtick',[],'xticklabel',[])
set(handles.axes4,'ytick',[],'yticklabel',[]);box on
axes(handles.axes5)
cla reset
set(handles.axes5,'xtick',[],'xticklabel',[])
set(handles.axes5,'ytick',[],'yticklabel',[]);box on
axes(handles.axes6)
cla reset
set(handles.axes6,'xtick',[],'xticklabel',[])
set(handles.axes6,'ytick',[],'yticklabel',[]);box on
用eval函数就能很好用循环结构解决这一问题
for i = 1:6
eval(['axes(handles.axes' num2str(i) ')'])
cla reset
set(eval(['handles.axes' num2str(i)]),'xtick',[],'xticklabel',[])
set(eval(['handles.axes' num2str(i)]),'ytick',[],'yticklabel',[])
box on
end
但是,还是尽量避免使用该函数,普通小型代码看不出对计算机性能的影响,但是官方并不推荐使用改代码,给出如下解释
eval 函数的许多常见用法的效率不如其他 MATLAB 函数和语言构造高效,更难阅读和调试。有关详细信息,请参阅eval 函数的替代方法。尽可能不在 eval 函数的输入中包含输出参数,例如 eval(['output = ',expression])。首选语法, output = eval(expression)
允许 MATLAB 解析器对代码执行更严格的检查,防止捕捉不到的错误和其他意外行为。
虽然 eval 函数非常强大和灵活,但它并不总是编程问题的最佳解决方案。与使用其他函数或语言构造的代码相比,调用 eval 的代码通常效率较低,而且难以阅读和调试。例如:
- MATLAB® 会在您首次运行代码时对代码进行编译,以增强以后运行的性能。但是,由于 eval 语句中的代码可在运行时更改,因此无法进行编译。
- eval 语句中的代码可能会意外创建变量或为当前工作区中已存在的变量赋值,并覆盖现有的数据。
- eval 语句中的串联字符向量通常难以阅读。其他语言构造方式可以简化您代码中的语法
tic
n1=1;n2=1;n3=1;
n4=1;n5=1;n6=1;
n7=1;n8=1;n9=1;
n10=1;n11=1;n12=1;
n13=1;n14=1;n15=1;
n16=1;n17=1;n18=1;
n19=1;n20=1;n21=1;
n22=1;n23=1;n24=1;
n25=1;n26=1;n27=1;
n28=1;n29=1;n30=1;
n31=1;n32=1;n33=1;
n34=1;n35=1;n36=1;
n37=1;n38=1;n39=1;
n40=1;n41=1;n42=1;
n43=1;n44=1;n45=1;
n46=1;n47=1;n48=1;
n49=1;n50=1;
toc
eval代码为
tic
for i=1:50
eval(['n',num2str(i),'=','1;'])
end
toc
普通代码运行时间为0.000188s,而eval函数运行时间为0.008396s,约一个数量级,可见eval函数执行效率并不高,然而我们依然用得很香 , 因为我们普通代码量对计算机运算效率基本一样,微乎其微,一些场合还是强烈推荐使用该函数。
下期精彩预告
基于Shamir 的视觉密码技术,一个 Shamir 的视觉密码方案可以对一幅秘密图像加密生成多个类噪声无意义的共享图像,并将这些图像分发给不同的参与保护秘密图像的参与者手中,从而保护秘密信息不被窃取。如果要恢复秘密图像,则收集起 K 幅或多于 K 幅共享图像并将图像分别打印在透明胶片上。最后将打印了共享图像的透明胶片直接叠加即可通过肉眼观察出共享于其中的秘密图像。当然恢复工具不一定必须是透明胶片,随着计算机的发展,任何计算机设备几乎都可以完成图像叠加功能,也就可以完成对视觉密码方案的恢复。视觉密码技术的安全性是建立在生成的每一幅共享图像都是无意义的图像,并且少于 K 幅共享图像无法获取秘密图像的任何有用信息。这一特点保证了即使有少量共享图像被盗取或者丢失,被共享的秘密图像仍然是安全的。
例如,将一个秘密分为两个图片分别给两根人保管,只有当两个人同时存在,秘密才能显现。
往期精彩阅读
条形图学习札记——如何排序并指定坐标标签
MATLAB图论实例——最短路径
四点悬置六自由度动力学响应仿真与分析系统
A、C频率计权网络
MATLAB函数库大全(收藏版)
科技论文写作WORD必备技巧——排版
数学建模——无约束优化问题
基于MATLAB的核放射素查询系统
基于MATLAB云图背景图片的添加(一)
基于MATLAB文本转语音包的实现
MATLAB调用摄像头实例
基于MATLAB制作简易画板
基于MATLAB的心电图信号分析与处理
Lamb频散曲线快速绘制软件
软著——高阶椭圆齿轮副参数设计与分析系统
日常札记——关于极坐标绘图的若干小问题
基于MATLAB定时器timer函数制作数字万年历
基于MATLAB视频处理——抖音小视频去除水印
抖音上火起来的来的撩妹神器
基于compass函数的时钟制作
如何验证身份证号码是否合法
MATLAB版本的扫雷小游戏
基于hough变换的直线检测
MATLAB 如何生成 APP ———以运动模糊图像复原为例
高效办公路上MATLAB助你一臂之力
微积分问题的MATLAB求解(二)——龙贝格积分的算法实现
微积分问题的MATLAB求解(一)
技巧篇——如何抓取网页中的图片
数据插值与拟合
MATLAB版本的俄罗斯方块
凉凉——可变速小风扇
跟着工科男学英语单词
Matlab GUI 简介
你的时光倒映机
谁说工科男不解风情
您有一份软件著作权请查收
高逼格坐标轴函数
plot3与mesh的区别
在学习中得到乐趣,在乐趣中收获学习,欢迎关注和分享该公众号。如果您有什么建议可以公众号直接回复即可。期待您的加入,也希望您分享给您身边有需要的人,建议直接将该公众号设为星标记公众号,以免错失精彩文章。QQ技术支持交流群:621250505