主要内容

assignin

R2026b

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

描述

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 工作区变量 name 和 age2050 中。

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

Screenshot of dialog box.

在“工作区”面板中查看导出的值。

创建一个可将输入年龄更改为 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 中对函数句柄进行计算后,会使用 n 对 assignfh2 中定义的 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 调用 funB。funB 的调用方工作区就是 funA。因此,您可以通过使用 assignin 并将工作区指定为 'caller',从 funB 中为 funA 中的变量赋值。

注意

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

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

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

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

数据类型: char | string

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

数据类型: 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 之前推出