Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

assignin

为指定工作区中的变量赋值

说明

示例

assignin(ws,var,val) 将值 val 赋给工作区 ws 中的变量 var。例如,assignin('base','x',42) 将值 42 赋予 MATLAB® 基础工作区中的变量 x

如果需要计算 val,MATLAB 会在调用 assignin 的函数中进行计算,而不是在 ws 指定的工作区进行计算。如果 val 是函数句柄,则它在调用 assignin 的函数中必须是可计算的。

assignin 函数对于以下任务很有用:

  • 将数据从函数导出至基础工作区。

  • 从函数中更改调用方函数的工作区中定义的变量值。例如,您可以在调用函数参数列表中更改变量的值。

示例

全部折叠

在当前工作文件夹下的文件中创建一个函数,用于添加两个数字并为基础工作区中的变量 fcnStatus 赋值。

function c = myAdd(a,b)
    c = a+b;
    
    str = sprintf('%s called with %d,%d (%s)',mfilename,a,b,char(datetime));
    assignin('base','fcnStatus',str)
end

在命令提示符下调用该函数。

n = myAdd(2,3)
n =

     5

查看 myAdd 函数在基础工作区中为 fcnStatus 变量所赋的值。

fcnStatus
fcnStatus =

    'myAdd called with 2,3 (17-Nov-2017 14:56:14)'

在当前工作文件夹中的文件中创建一个函数,用于显示输入姓名和出生年份的对话框并计算到 2050 年时的年龄。assignin 函数将值导出到 MATLAB 工作区变量 nameage2050 中。

function mydialog
    prompt = {'Enter name:','Enter birth year:'};
    answer = inputdlg(prompt);
    
    n = answer{1};
    birthyear = str2double(answer{2});
    a = 2050-birthyear;
    
    assignin('base','name',n);
    assignin('base','age2050',a);
end

在命令提示符下运行该函数,输入数据,然后点击确定。

mydialog

在工作区浏览器中查看导出的值。

创建一个可将输入年龄更改为 42 的函数。在 localfcn 中调用 assignin 将更改主函数 updateAge 的工作区中的 a 值。

function updateAge(a)
    validateattributes(a,{'numeric'},{'scalar'})
    fprintf('\tYour age: %d\n',a)
    localfcn
    fprintf('\tYour updated age: %d\n',a)
end

function localfcn
    assignin('caller','a',42)
end

在命令提示符下调用主函数。

updateAge(37)
	Your age: 37
	Your updated age: 42

虽然本示例说明了如何将变量分配到调用方工作区,但最好的做法是让局部函数 localfcn 返回更新后的年龄作为输出参数。

在当前工作文件夹下的文件中创建一个函数,用于查找随机数组的最小值。assignfh 局部函数将函数句柄 fh 分配给 minRand 的工作区。minRand 函数使用输入 n 计算 fh

function m = minRand(n)
    assignfh
    
    A = fh(n)
    m = min(A(:));
end

function assignfh
    fh = @(dim)rand(dim);
    assignin('caller','fh',fh)
end

使用输入值 2 调用该函数。

m = minRand(2)
A =

    0.3486    0.1423
    0.0419    0.0766


m =

    0.0419

函数句柄的计算结果是一个 2×2 的随机数组。

创建另一个版本的函数,称为 minRand2,用局部函数覆盖函数句柄定义中的 rand 函数。

minRand 示例相似,assignfh2 局部函数将 fh 分配给 minRand2 的工作区。assignfh2 函数使用名为 rand 的变量覆盖其工作区中的 rand 函数并创建函数句柄。这种行为与匿名函数一致 - 函数句柄是使用创建函数时可用的变量创建的。因此,在 minRand2 中对函数句柄进行计算后,会使用 nassignfh2 中定义的 rand 数组进行索引。

function m = minRand2(n)
    assignfh2(n)
    
    A = fh(n)
    m = min(A(:));
end

function assignfh2(n)
    rand = 13*ones(n);
    fh = @(dim)rand(dim);
    assignin('caller','fh',fh)
end

使用输入值 2 调用该函数。

m = minRand2(2)
A =

    13


m =

    13

将匿名函数分配到调用方工作区时,MATLAB 将函数句柄的定义放入调用方工作区的变量中。调用 assignin 的函数将计算函数句柄。虽然这些示例说明了如何将变量分配到调用方工作区,但最好的做法是让局部函数 assignfh 返回函数句柄作为输出参数。

输入参数

全部折叠

工作区,指定为 'base''caller'

要在 MATLAB 基础工作区中赋值,请使用 'base'。基础工作区存储您在 MATLAB 命令提示符下创建的变量,包括脚本创建的任何变量(假设您从命令行或编辑器中运行脚本)。

要为调用方函数的工作区中的变量赋值,请使用 'caller'。调用方工作区是调用当前运行函数的函数工作区。例如,假设 funA 调用 funBfunB 的调用方工作区就是 funA。因此,您可以通过使用 assignin 并将工作区指定为 'caller',从 funB 中为 funA 中的变量赋值。

注意

为调用方工作区中的变量赋值可能会使代码变得更难以理解,产生意外结果(工作区中出现意外的变量或变量被重新定义),并对性能产生负面影响。最好的做法是让函数返回变量作为输出参数。

在以下情况下,基础工作区和调用方工作区相同:

  • 您从命令提示符下调用函数,而主函数调用 assignin

  • 您从命令提示符下调用 assignin

数据类型: char | string

变量名称,指定为字符向量或字符串标量。如果指定的工作区中不存在 varassignin 函数将创建它。

数据类型: char | string

变量的值,指定为标量或数组值。val 可以是任何数据类型,并且可以包含 MATLAB 表达式。

如果需要计算变量的值,MATLAB 会在包含 assignin 调用的函数中进行表达式计算,而不是在 ws 指定的工作区中进行计算。如果 val 是函数句柄,则它在调用 assignin 的函数中必须是可计算的。

示例: 5

示例: 'hello'

示例: rand(3,7)

示例: @cos

提示

  • assignin 函数不会为数组的特定元素赋值。因此,var 不能包含数组索引。以下代码将导致错误。

    X = 1:8;
    assignin('base','X(3:5)',-1);
    

    要为数组的特定元素赋值,请使用 evalin 函数。

    evalin('base','X(3:5) = -1')
    

在 R2006a 之前推出