我是靠谱客的博主 震动枕头,最近开发中收集的这篇文章主要介绍matlab添加到静态工作区,Matlab:“使用assignin时出错:尝试将”c“添加到静态工作区”(Matlab: “Error using assignin: Attempt to add ”...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 ”...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部