精华内容
下载资源
问答
  • 在GUI中一个控件函数结束后,会将在这个函数中使用的变量全部删除,如果想在另一个控件中使用,则必须想办法将这个变量保存传递,方法有以下几种:1、使用globe定义全局变量,这种方法不是很好,一方面是要在使用...

    在GUI中一个控件函数结束后,会将在这个函数中使用的变量全部删除,如果想在另一个控件中使用,则必须想办法将这个变量保存传递,方法有以下几种:

    1、使用globe定义全局变量,这种方法不是很好,一方面是要在使用变量的函数里面要先对变量进行声明,另一方面,在一个函数里面对变量进行操作就会对所有函数起作用,这样不是太方便,但毕竟是一种解决方法。

    function btn1_callback(hObject,userdata,handles)

    global var1

    %对var1的处理

    function btn2_callback(hObject,userdata,handles)

    global var1

    %对var1的引用

    2、使用guidata函数,使用方法是:

    handles.X=str2double(get(hObject,'String'));

    guidata(hObject,handles);

    在别的函数中只要使用handles.X就可以得到str2double(get(hObject,'String'))数值。

    这种方法的好处是,在改变了控件的Tag后,方便使用相应控件传递来的数据,缺点是要改变控件的句柄handles值,这样似乎不是很安全。

    3、使用空间的userdata属性保存数据,使用方法如下:

    set(handles.X,'userdata',a);

    这里a就是要传递的变量,现在暂时保存在这个控件的userdata中,需要取出时:

    a=get(handles.X,'userdata');

    即可将a传递到新函数中,如果要传递的是多个变量,可以使用结构数组进行传递

    这种方法是最安全且自由度高的传递方法,推荐!!!

    转自:

    关于gui中不同函数间数据传递

    http://www.ilovematlab.cn/thread-139436-1-1.html

    (出处: MATLAB中文论坛)

    &

    http://zhidao.baidu.com/question/122975623.html?loc_ans=385198831

    展开全文
  • Matlab函数进阶:使用匿名函数(AnonymousFunction)和内嵌函数(NestedFunction)处理多变量传递问题(Matlab7.0以上)问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0和a=a1b=b1c=c1的条件下对f(abcx)进行某一...

    Matlab

    函数进阶:

    使用匿名函数

    (Anonymous Function)

    和内嵌函数

    (Nested Function)

    处理多变量传递问题

    (Matlab 7.0

    以上

    )

    问题:

    有一个多变量函数

    f

    (

    a

    b

    c

    x

    )

    ,

    现需要分别在

    a

    =

    a

    0

    b

    =

    b

    0

    c

    =

    c

    0

    a

    =

    a

    1

    b

    =

    b

    1

    c

    =

    c

    1

    的条件下对

    f

    (

    a

    b

    c

    x

    )

    进行某一操作。

    此类问题常在数值积分时出现。

    解决方案:

    1

    .使用全局变量

    可在主调函数和被调函数中分别将

    a,b,c

    声明为全局变量

    (

    global

    a b c

    )

    ,这时

    f

    通过全局

    变量传递

    abc,

    定义时可以只有一个参数

    x

    2

    .使用

    anonymous function

    3

    .使用

    nested function

    下面举例说明

    anonymous function

    nested function

    的使用。

    例:

    对任意二次多项式

    ax

    2

    +bx+c

    进行数值积分

    (此处显然可以解析得到,此例使用

    anonymous

    function

    做演示)

    解:(

    1

    )使用匿名函数

    编写文件

    intpoly2.m

    如下

    function

    y_int=intpoly2

    (

    a,b,c

    )

    y_int=quad

    (

    @

    (

    x

    )(

    poly2

    (

    a,b,c,x

    ))

    ,

    0

    1

    )

    ;

    %

    此处利用

    matlab

    内部函

    %

    quad(fun, x0,xt)

    进行积分,

    %

    被积函数

    fun

    我们使用匿名函

    %

    "@(x)(poly2(a,b,c,x))"

    以便

    %

    将自变量限制为

    x.

    展开全文
  • 本文介绍了一种函数函数之间相互传递参数的方法,可以方便的实现函数函数之间传递参数,并且不会产生混乱,更不会导致全局变量的滥用。本文所编写的程序使用MATLAB语言,对其他编程语言也可以借鉴其思想。 背景 ...

    前言

    本文介绍了一种函数与函数之间相互传递参数的方法,可以方便的实现函数与函数之间传递参数,并且不会产生混乱,更不会导致全局变量的滥用。本文所编写的程序使用MATLAB语言,对其他编程语言也可以借鉴其思想。

    背景

    一般的函数与函数传递参数使用形参输入,但是这种方法导致形参固定(或者可变),需要程序对输入变量进行解析,而且必须相互调用才能传递参数,这样传递参数的效率很低,而且很不方便。最常见的方法为定义全局变量,然后在每个函数中声明全局变量,但是这种方法常常导致全局变量的滥用,容易导致变量的重名和混淆,不利于程序的模块化编程。本文介绍的传递参数方法虽然也是使用的全局变量,但是在使用时是利用一套函数对全局变量进行操作,实现函数与函数传递变量更加灵活和安全。

    介绍

    本方法利用一套函数对全局变量操作,可以实现以下功能:

    1. 函数与函数之间的定点发送,其他函数不能接收到
    2. 函数与所有函数之间的广播发送,所有函数均能收到
    3. 取消传递的参数

    函数用法示例

    利用历史计算结果加速重复调用函数时的调用速度

    名称为fun1的函数发送给自身消息,例如fun1功能为执行特定的计算,并将计算得到的结果输出。且该函数的计算结果(输出)在多处使用到,由于程序由多个函数组成,且经常形成函数互相调用的情况。因此,当其他函数需要使用fun1输出的计算结果时,常常由于函数之间多层调用的关系获取不到fun1的输出结果。为了避免其他函数调用fun1从而导致重复执行fun1的情况,利用将消息发送给自身的方法,提高效率。

    function [res1,res2] = fun1(par1,flush)
    % 当输入为两个参数时,将重新计算;可控制是否重复执行该函数
    if nargin > 1
        messages_clear( 'fun1' );
    end
    %%%%%%%%%%%%%%%%%%%%%%%%
    % 获取消息,首次执行该函数时消息为空,执行函数的具体内容
    message = message_get();
    % 首次执行该函数的最后部分将计算结果发送给自身,因此非首次进入时直接获取首次执行结果,并返回函数,避免了多次运行该函数,提高了运行效率
    if isfield( message, 'res1' ) && isfield( message, 'res2' )
        res1= message.res1;
        res2= message.res2;
        return ;
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%
    % 函数执行的具体内容,用于输出结果的计算
    %%%%%%%%%%%%%%%%%%%%%%%%%
    % 将结果发送给自身,导致本函数仅执行首次,第二次进入时直接获取消息
    messages_sendto( 'fun1', 'res1', res1);
    messages_sendto( 'fun1', 'res2', res2);
    

    这种使用方法包含三要素:

    1. 是否控制函数重新计算,有时可能需要函数重新计算,舍去历史计算的结果
    2. 检查是否自身发送的结果,当存在时直接读取
    3. 最后将计算的结果发送给本身,加快调用速度
    展开全文
  • 使用匿名函数(Anonymous Function)和内嵌函数(Nested Function)处理多变量传递问题(Matlab 7.0以上) 问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0和a=a1b=b1c=c1的条件下对f(abcx)进行某一操作。 此类...

    from: http://asc.2dark.org/node/70

    Matlab 函数进阶:

    使用匿名函数(Anonymous Function)和内嵌函数(Nested Function)处理多变量传递问题(Matlab 7.0以上)

    问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0a=a1b=b1c=c1的条件下对f(abcx)进行某一操作。

    此类问题常在数值积分时出现。

    解决方案:

    1. 使用全局变量

    可在主调函数和被调函数中分别将a,b,c声明为全局变量(global a b c),这时f通过全局变量传递abc, 定义时可以只有一个参数x。

    2. 使用anonymous function

    3. 使用 nested function

    下面举例说明anonymous function和nested function的使用。

    例:对任意二次多项式进行数值积分01(ax2+bx+c)dx (此处显然可以解析得到,此例使用anonymous function做演示)

    解:(1)使用匿名函数

    编写文件intpoly2.m
    如下

    function y_int=intpoly2(a,b,c)
    y_int=quad(@(x)(poly2(a,b,c,x)), 0,1);  %此处利用matlab内部函
                                  %数quad(fun, x0,xt)进行积分,
                                  %被积函数fun我们使用匿名函
                                  %数“@(x)(poly2(a,b,c,x))”以便
                                  %将自变量限制为x. 
     
    function y=poly2(ai,bi,ci,x)  %此处定义一个多变量的子函数 poly2( a,b,c,x)
    y=ai.*x.^2+bi.*x+ci;         %此处使用矩阵元素运算(.*  和.^)等便于
                                  %被矩阵化的内部函数调用,且提高程序效率


    执行:

    保存该文件并将matlab切换至该文件目录下,命令行输入intpoly2(1,2,3), 便给出积分结果ans=4.33

    实际上,上例也可以简化成:

    function y_int=intpoly2(a,b,c)
    y_int=quad(@(x)(a.*x.^2+b.*x+c), 0,1);  %此处利用matlab内部函
                                  %数quad(fun, x0,xt)进行积分,
                                  %被积函数fun我们使用匿名函
                                  %数@(x)(a.*x.^2+b.*x+c)以便
                                  %将自变量限制为x. 
    
    

    (2)使用nested function

    编写函数保存为intnest.m, 内容如下

    function y_int=intnest(a,b,c)
    y_int=quad(@poly2, 0,1);      %此处利用matlab内部函
                                   %数quad(fun, x0,xt)进行积分,
                                   %被积函数fun我们使用内嵌函
                                   %数poly2(x)的句柄@poly2 
     
    function y=poly2(x)           %此处定义一个内嵌函数 poly2( a,b,c,x) 
    y=a.*x.^2+b.*x+c;            %直接调用母函数中的变量a,b,c
    end                           % 结束内嵌函数poly2
    end                           % 结束母函数intpoly2
    
    

    保存后执行,同样效果。

    可见nestedfunction只是将主调函数和被调函数封装到了一起以共享主调函数的变量。

    注意:一般函数不需要end,当出现nested function时,主调函数和被调函数都必须有end 来结束

     

     

    附:

    M脚本文件和M函数文件、函数句柄
    m文件分两种:函数和脚本。
    1、matlab script file:
    脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。
    任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子:
     
    例1: 产生一个20元素的一维随机数组并画出。
    解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码:
    data=randn(1,20);  
    plot(data);
    保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。
    脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右键在快捷菜单中选择creat M file来快速创建一个m文件。
     
    2、matlab function
    函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例:
    例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误
    差err=sqrt(sum(X)/(N*(N-1))), 代码如下:
    function err=stderr(arr)
    %实验误差(标准差估计)
    %caculate along each column of arr
    err=std(arr)./sqrt(size(arr,1)-1);
    文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出a的方差。(若输入行数组则发散,因N-1=0)
    此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后面同一行。无需再使用return将err的值返回。
    注意:
    (1)函数文件的命名要使用文件内主函数声明的名称,否则出错。
    (2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后
    面。
    (3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3)
    例1中的m文件可在第一行前插入一行:
    function randplt
    保存后则该文件成为一个没有输入输出宗量的函数。
    一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。
     
    3.函数句柄的使用
    函数句柄起到c语言中函数指针的作用。
    例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。
    解: 编写如下文件并保存为erreval.m
    function [s1,s2]=erreval(err,arr1,arr2)
    % err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差.
    s1=feval(err,arr1);
    s2=feval(err,arr2);
    此文件的输入包含"函数变量", 通过函数句柄实现函数变量err的赋值。
    运行时先运行如下命令建立数组arr1,arr2:
    arr1=[1;2;3];
    arr2=[10;20;30];
    然后输入
    [std1,std2]=erreval(@std,arr1,arr2)
    [stderr1,stderr2]=erreval(@stderr,arr1,arr2)
    执行后返回四个误差值。
    @std,@stderr为两误差函数的函数句柄。
    
    
    
    
    展开全文
  • MATLAB GUI不同控件函数变量传递方法 (此篇文章全部为转载,转载网址:https://www.cnblogs.com/Dontstop/p/5379685.html) ** 在GUI中一个控件函数结束后,会将在这个函数中使用的变量全部删除,如果想在另一个...
  • Matlab- 主函数和子函数间接传递变量

    万次阅读 2017-09-12 14:02:03
    matlab一般可以通过函数的输入和输出接口来传递变量,但是有的时候,我们因为函数已经写好,并在比较多的脚本中被调用,此时再修改输入接口的工作量比较大,如果可以通过其它方式传递变量,就可以省去很多的工作量...
  • matlab一般可以通过函数的输入和输出接口来传递变量,但是有的时候,我们因为函数已经写好,并在比较多的脚本中被调用,此时再修改输入接口的工作量比较大,如果可以通过其它方式传递变量,就可以省去很多的工作量...
  • assignin 与evalin MATLAB 通常的基本工作空间是'base'空间MATLAB 在程序运行过程中将为每个函 数分配它自己的函数工作空间从基本空间中分割出的一块以函数名作为其工作空间名 各个工作空间之间的变量是不能够直接...
  • matlab全局变量和局部变量和子函数

    千次阅读 2020-05-23 17:09:04
    全局变量和中间变量 函数文件中的变量都是局部的,即一个函数文件中定义的变量...全局变量的作用域是整个MATLAB工作空间,即全程有 效。定义全局变量是 M文件间传递信息的一种手段。 global 变量名列表 变量名列表中的
  • <p>How can I pass the input variables from php into matlab function?...$command = "matlab -sd ".$inputDir." -r saladsalad('".$in1."','".$in2."')"; exec($command); </code></pre> </div>
  • Matlab GUI,全局变量,单个窗体内各个函数之间传递数据
  • (2)系数为变量传递函数怎么求其零极点表达式?(3)只知道一组节点方程,如何推导系统传递函数?01系数已知的传递函数怎么求其零极点?1.1 问题如果我们拿到了一个传递函数,其所有系数是已知的,怎么计算其零极点?...
  • 声明:关于变量传递问题使用的是handles和guidata函数。 首先创建一个gui 空白界面: 打开第一个,可以看到界面   创建一个按钮,一个切换按钮,一个列表框 假设我要完成的事件是这样的: 按钮为赋值...
  • matlab gui中的变量传递

    千次阅读 2014-06-08 19:34:36
    m文件中每个callback都可以视为一个独立执行的接口,也就说每个callback之间无法做沟通操作,因此变量传递会有问题,有以下几种方式可以解决不同的回调函数之间的数据传递问题: 1.使用全局变量 当前有一组...
  • MATLAB在程序运行过程中,将为每个函数分配它自己的函数工作空间(从基本空间中分割出的一块, 以函数名作为其工作空间名),各个工作空间之间的变量是不能够直接引用的,在函数退出之后,该函数空间也就立即被注销...
  • 实验一 MATLAB 系统的传递函数和状态空间表达式的转 换 一 实验目的 1学习多变量系统状态空间表达式的建立方法 2 通过编程上机调试掌握多变量系统状态空间表达式与传递函数之间相互 转换的方法 3掌握相应的MATLAB ...
  • (2)系数为变量传递函数怎么求其零极点表达式?(3)只知道一组节点方程,如何推导系统传递函数?01系数已知的传递函数怎么求其零极点?1.1 问题如果我们拿到了一个传递函数,其所有系数是已知的,怎么计算其零极点?...
  • 变量系统传递函数模型转换为状态空间模型的MATLAB实现方法 以下以双输入双输出系统为例 % Thansfer multiple transfer functions into sate space models clc clear all % Step1输入传递函数分子分母系数 %From u1...
  • 原网页:http://www.ilovematlab.cn/thread-34829-1-1.html 问题如下: 我现在的GUI界面上有两个控件:一个是 pushbutton,一个是edit1, ... 上输入获取,也就是将edit1中的输入值传递变量K。请问该如何实现
  • 其中num为分子的系数数组,den为分母的系数数组,都是按照自变量的幂进行降序排列,输出为tf类型的连续时间传递函数 举例: >> num=[0 12 24 0 20]; >> den=[2 4 6 2 2]; >> tf(num,den) ans = ...
  • 比如AX= b,求解x,但是要找不同b下的x,100个b。 fsolve(‘fun,[X0,b])这样是不行的,因为这样的话b也当成了变量,也会变。 两种方法 ...2.函数句柄 @一直无法识别。 全局变量挺好用的。 ...
  • 文章目录MATLAB GUI传递方式1、全局变量;2、作为函数的参数传递;3、利用控件的userdata数据;4、为handles结构体添加新字段;5、setappdata函数为句柄添加数据;...运用global定义全局变量传递参...
  • matlab函数句柄

    2021-01-17 18:11:00
    matlab函数句柄 直接调用函数:  被调用函数只能被其M文件同名的主函数或在M文件中的其他函数调用,一个文件只有一个主函数。 间接调用函数:  避免只能使用直接调用函数的情况,个人理解就是为一个函数起了一个...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 227
精华内容 90
关键字:

matlab函数变量传递

matlab 订阅