概述
Matlab:“使用assignin时出错:尝试将”c“添加到静态工作区”(Matlab: “Error using assignin: Attempt to add ”c“ to a static workspace”)
我有以下功能定义(测试代码):
function [X,Y,Z] = test(x,y,z)
syms a b c;
a = b + c; % This is where it gets wrong
X=x;
Y=y;
Z=z;
keyboard
% nested functions
function y = fun1(t,x)
y=t+x;
end
function res = bvpbc(y0,yT)
res= y0+yT;
end
end
基本上,我在test函数中有一些嵌套函数,我在其中声明了一些符号变量a , b和c 。 但是,当我通过键入运行该功能
test(1,1,1)
始终存在此错误消息:
Error using assignin
Attempt to add "b" to a static workspace.
See MATLAB Programming, Restrictions on Assigning to
Variables for details.
Error in syms (line 66)
assignin('caller',x,sym(x));
Error in test (line 3)
syms a b c;
符号声明似乎有些不对劲,但我不明白为什么。 我该如何解决?
谢谢!
编辑:此外,每当我删除两个嵌套函数时, test函数将正常工作。
I have the following piece of function definition (test code):
function [X,Y,Z] = test(x,y,z)
syms a b c;
a = b + c; % This is where it gets wrong
X=x;
Y=y;
Z=z;
keyboard
% nested functions
function y = fun1(t,x)
y=t+x;
end
function res = bvpbc(y0,yT)
res= y0+yT;
end
end
Basically, I have some nested functions within the test function, where I declared some symbolic variables a, b and c. However, when I run the function by typing
test(1,1,1)
there is always this error message:
Error using assignin
Attempt to add "b" to a static workspace.
See MATLAB Programming, Restrictions on Assigning to
Variables for details.
Error in syms (line 66)
assignin('caller',x,sym(x));
Error in test (line 3)
syms a b c;
It seems to be something wrong with the symbolic declarations, but I don't understand why. How can I fix it?
Thank you!
EDIT: In addition, whenever I remove the two nested functions, the test function will work just fine.
原文:https://stackoverflow.com/questions/17105493
更新时间:2019-12-22 14:57
最满意答案
下面的最小工作示例重新创建了问题,正如Andrew Janke在评论中解释的那样,不是一个错误:
function foo
syms A
function nested
end
end
您可以通过将符号变量显式分配给工作区来解决它:
A = sym('A');
The following minimal working example recreates the problem, and as Andrew Janke explains in the comments, is not a bug:
function foo
syms A
function nested
end
end
you can work around it with an explicit assignment of the symbolic variable to the workspace:
A = sym('A');
2017-05-23
相关问答
好的,让我们先来看一个SSCCE的快速示例: function [Z,Y] = khan
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[Z,Y] = ode45(@momentum,[0 12],[0 0],options);
end
function Dy = momentum(z,y)
Dy = [0 0]';
Dy(1) = 3*y(1) + 2* y(2) - 2;
Dy(2) = y(1) - y(2);
Ve = Dy(1)+
...
下面的最小工作示例重新创建了问题,正如Andrew Janke在评论中解释的那样,不是一个错误: function foo
syms A
function nested
end
end
您可以通过将符号变量显式分配给工作区来解决它: A = sym('A');
The following minimal working example recreates the problem, and as Andrew Janke explains in the comments, i
...
运行assignin命令时,请regionname周围的引号,如下所示。 然后它将使用变量regionname的值作为新变量名。 assignin('base', regionname ,[a;b;c;d]);
Leave off the quotes around regionname when you run the assignin command, as follows. Then it will use the value inside the variable regionname
...
我最终使用了PowerShell脚本,如Microsoft开发站点所述: https : //msdn.microsoft.com/en-us/library/dn376353.aspx 。 我将其与TFS Power工具结合使用,并使用了Add-TfsPendingChange和New-TfsChangeset cmdlet,但我还使用了需要更多控制的TFS API .Net对象。 我没有使用我们最初的自定义Build活动,但我们确实定制了构建定义,以允许在TFS 2013标准模板的更多阶段调用
...
assignin('base', 'arg', setfield('arg.aa','abc', 60))
我认为这不是你想要的。 此调用首先在本地/函数工作空间中计算setfield('arg.aa','abc', 60) ,然后仅将结果分配给基本工作空间。 由于第一个setfield参数是一个字符串,因此导致单个字段abc具有值60的结构。 (这应该是警告btw。) 您可以将其替换为: evalin('base', 'arg.aa = setfield(arg.aa, ''abc'', 60
...
如果您的输入是字符串,则可能需要使用以下语法: baseFunctionType = input('Please enter the type of base functions?(Polynomial = P ,Gaussian = G)','s');
查看文档以获取更多详细信息。 You probably need to use the following syntax given that your input is a string: baseFunctionType = input('
...
“静态”意味着固定,“工作空间”是Matlab称之为存储所有变量的地方。 对于非嵌套函数,当Matlab位于函数的开头时,工作空间开始为空; 随着Matlab继续通过函数的代码行,它不断向工作区添加更多变量。 对于具有嵌套函数的函数,Matlab首先解析函数以查看将创建的变量(它专门查找x =类型行),然后创建所有这些变量(值为“未分配”),然后仅执行它开始贯穿代码; 但是在运行代码时,它永远不会创建新的变量。 这就是代码的原因 function TestNestedFunction
syms x
...
使用DBSTACK %# true if the function has been called from base
callerIsBaseWorkspace = length(dbstack) == 1;
Use DBSTACK %# true if the function has been called from base
callerIsBaseWorkspace = length(dbstack) == 1;
最后
以上就是震动枕头为你收集整理的matlab添加到静态工作区,Matlab:“使用assignin时出错:尝试将”c“添加到静态工作区”(Matlab: “Error using assignin: Attempt to add ”...的全部内容,希望文章能够帮你解决matlab添加到静态工作区,Matlab:“使用assignin时出错:尝试将”c“添加到静态工作区”(Matlab: “Error using assignin: Attempt to add ”...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复