matlab meshc函数_自动执行文本中的 MATLAB 表达式——关于eval函数的使用技巧

931e12980eac529e6a7e8cfc5977b151.gif

702bad81f97e50d76d60bb456b9a01c6.png

之前有读者在后台留言,询问关于eval函数的使用方法,以即什么时候适合用它,今天给大家简单讨论关于eval函数的使用方法与技巧。

函数介绍

函数:eval

功能:执行文本中的 MATLAB 表达式

语法:eval(expression)

解读:此函数功能实际上是,可以将matlab里的一个字符串表达式,当作malab的命令来执行,例如字符串表达式‘x=0’,实际是字符串,但是当调用eval函数eval('x=0)命令时,matlab便执行该符串的表达式,将0赋值给变量x。

46a997ce824e79432cb0d7e9815f029f.png其实等价于直接输入命令 x=0 760b54f0d100cf4f7877d6d1e552d9fd.png

该函数适用于什么场合呢?,它适用于当我们变量名特别多,不想手动赋值时,通过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=')
8da9bd256878347f85e7443d5065fabd.png很显然改代码太机械,若有1000个变量,我们便要手动输入1000次,代码的作用是提高效率,弱化人体劳动,因此我们想到了用循环的结构编写,代码如下 for i = 1:10    n=input([ '请输入n' num2str(i) '=']); end 1ff12841df2dd3b71cc1ece5f6de9a80.png但是此时会存在一个问题,所有的值都在变量名n里,被一一次次替换掉,没有按照要有存在变量n1至n10,此时eval函数的功能就派上用场。

for i = 1:10

    n = input(['n' num2str(i) '=']);

   eval([ 'n',num2str(i),'=n'])

end

1a31779ba278eba105efcd59993c65f3.png

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发挥着更大作用。 e104782f8c7755ff9ba457af68fd7d4b.png例如在此系统界面中有许多绘图坐标,想为用户设置一个一键清除所有绘图数据,代码如下

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


92b8101ee64f94b40dfe2a547aa1645a.png

但是,还是尽量避免使用该函数,普通小型代码看不出对计算机性能的影响,但是官方并不推荐使用改代码,给出如下解释

eval 函数的许多常见用法的效率不如其他 MATLAB 函数和语言构造高效,更难阅读和调试。有关详细信息,请参阅eval 函数的替代方法。尽可能不在 eval 函数的输入中包含输出参数,例如 eval(['output = ',expression])。首选语法,                            output = eval(expression)                                                            

允许 MATLAB 解析器对代码执行更严格的检查,防止捕捉不到的错误和其他意外行为。   

虽然 eval 函数非常强大和灵活,但它并不总是编程问题的最佳解决方案。与使用其他函数或语言构造的代码相比,调用 eval 的代码通常效率较低,而且难以阅读和调试。例如:

  • MATLAB® 会在您首次运行代码时对代码进行编译,以增强以后运行的性能。但是,由于 eval 语句中的代码可在运行时更改,因此无法进行编译。
  • eval 语句中的代码可能会意外创建变量或为当前工作区中已存在的变量赋值,并覆盖现有的数据。
  • eval 语句中的串联字符向量通常难以阅读。其他语言构造方式可以简化您代码中的语法
 在这里,小编做了一个测试,结果表明eval的效率确实不高,执行效率不大。将变量n1,n2至n50分别赋值为1,传统代码为

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

2ccfebca706e1e16a64cb79d68a206c6.png

eval代码为


        tic

for i=1:50

    eval(['n',num2str(i),'=','1;'])

end

toc


ffb72bce5583ee26eac2b8c58730dc6b.png

       普通代码运行时间为0.000188s,而eval函数运行时间为0.008396s,约一个数量级,可见eval函数执行效率并不高,然而我们依然用得很香 bd858d93aeda44243dd955b313138481.png bd858d93aeda44243dd955b313138481.png bd858d93aeda44243dd955b313138481.png bd858d93aeda44243dd955b313138481.png, 因为我们普通代码量对计算机运算效率基本一样,微乎其微,一些场合还是强烈推荐使用该函数。                                 

下期精彩预告

基于Shamir 的视觉密码技术,

一个 Shamir 的视觉密码方案可以对一幅秘密图像加密生成多个类噪声无意义的共享图像,并将这些图像分发给不同的参与保护秘密图像的参与者手中,从而保护秘密信息不被窃取。如果要恢复秘密图像,则收集起 K 幅或多于 K 幅共享图像并将图像分别打印在透明胶片上。最后将打印了共享图像的透明胶片直接叠加即可通过肉眼观察出共享于其中的秘密图像。当然恢复工具不一定必须是透明胶片,随着计算机的发展,任何计算机设备几乎都可以完成图像叠加功能,也就可以完成对视觉密码方案的恢复。视觉密码技术的安全性是建立在生成的每一幅共享图像都是无意义的图像,并且少于 K 幅共享图像无法获取秘密图像的任何有用信息。这一特点保证了即使有少量共享图像被盗取或者丢失,被共享的秘密图像仍然是安全的。

d028180e6623c65b41e1aaedcb025821.png

7f4f21856682d1c7db15e50078d960f8.png

例如,将一个秘密分为两个图片分别给两根人保管,只有当两个人同时存在,秘密才能显现。

76b3d8d0f9e5b48db3389e348ef40073.png

往期精彩阅读

条形图学习札记——如何排序并指定坐标标签

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的区别

b579efb5fff702c759c4e647dbe7e56a.gif 在学习中得到乐趣,在乐趣中收获学习,欢迎关注和分享该公众号。如果您有什么建议可以公众号直接回复即可。期待您的加入,也希望您分享给您身边有需要的人,建议直接将该公众号设为星标记公众号,以免错失精彩文章。

QQ技术支持交流群:621250505

7669fc6356af30debcd2a93870031208.png    ef291faa44f64ebe09f4c5403a680b97.png

464a16a3c3bbe2e7a844b84c306c5ff6.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值