我有一个MATLAB函数来解决Inertia Tensor,我的程序中有一个嵌套函数。它中的所有变量都是符号,但它告诉我
“使用assignin时出错:尝试将”x“添加到静态工作区”
我不明白为什么会这样。这是我的test.m代码:
function test
syms x y z
f=x
f1=f+1
f2=f1^2
function r=test2
r=f2^3;
end
f3=test2
end
搜索此网络论坛后,我找到了一些答案。但与此同时我只是不理解
安德鲁·詹克(Andrew Janke)这样表达了它:虽然syms A看起来像静态变量声明,但事实并非如此。这只是一个常规的函数调用。它使用Matlab的“命令”调用样式看起来像语法,但它实际上等同于syms('a','b','c')。 在此页面上:Matlab: "Error using assignin: Attempt to add "c" to a static workspace"静态变量是什么意思?
我还搜索了HELP文档,它说:在函数和脚本中,不要使用syms来创建与MATLAB®函数同名的符号变量。对于这些名称,MATLAB不会创建符号变量,而是保留分配给函数的名称。
我只知道syms x
在工作区中创建一个符号变量,但为什么文档说MATLAB不会创建呢?
答案 0 :(得分:0)
我认为您找到的页面非常清楚。 您需要逐个声明变量并使用:
x = sym('x')
否则syms
会尝试将值分配到不允许这样做的工作区中。
答案 1 :(得分:0)
此代码有效:
function test
x=sym('x')
y=sym('y')
z=sym('z')
f=x
f1=f+1
f2=f1^2
function r=test2
r=f2^3;
end
f3=test2
end
答案 2 :(得分:0)
'静态'意味着固定,'工作空间'是Matlab调用存储所有变量的地方。对于非嵌套函数,当Matlab位于函数的开头时,工作空间开始为空;随着Matlab继续通过函数的代码行,它不断向工作区添加更多变量。
对于具有嵌套函数的函数,Matlab首先解析函数以查看将创建的变量(它专门查找x =
类型行),然后创建所有这些变量(值为'unassigned' ),然后才开始运行代码;但是在运行代码时,它永远不会创建新的变量。
这就是代码
的原因function TestNestedFunction
syms x;
function Nested()
end
end
生成错误,没有x =
告诉它在代码开头预先创建未分配的变量x
。它在syms x;
处失败,因为该行尝试创建一个新变量x
,该变量失败,因为它可能没有。
这也是以下代码运行的原因
function TestNestedFunction
syms x;
x = x;
function Nested()
end
end
它会看到x =
,然后预先创建x
。 (这就是为什么你添加[x, y, z] = deal([]);
的例子也有效)。
您可以使用简单非嵌套函数和简单嵌套函数开头的断点对此进行测试。只需一步一步地运行它。