我是MATLAB的新手并试图弄清楚这里发生了什么。我从csv文件导入一些数据然后生成一些变量,然后我将这些变量传递给函数,如下所示:
%% Get Var[X]
VH1 = var(H1);
%% Get E[X]
EH1 = mean(H1);
%% Get s[X] (skewness)
SH1 = skewness(H1);
%% test
v = [1,1,1]
U(v)
%% function
function f = U(v)
a = v(1);
b = v(2);
c = v(3);
f = a*EH1 + b*VH1+ c*SH1;
end
变量EH1
,VH1
和SH1
都显示在工作区中,似乎已正确生成,但当我运行脚本时,我得到:
Undefined function or variable 'EH1'.
Error in Inference>U (line 163)
f = a*EH1 + b*VH1+ c*SH1;
Error in Inference (line 156)
U(v);
我不知道我在哪里出错了。
答案 0 :(得分:4)
MATLAB的范围规则是默认情况下基础工作空间和功能工作空间之间不共享数据。 To quote:
基础工作区存储您在命令行中创建的变量。这包括脚本创建的任何变量,假设您从命令行或编辑器运行脚本。 ...
函数不使用基础工作区。每个函数都有自己的函数工作区。每个功能工作空间都与基础工作空间和所有其他工作空间分开,以保护数据的完整性。
EH1
,VH1
和SH1
在脚本的基本工作空间中定义,但不在函数工作空间中定义。
有几种解决方法,但我认为最简单的方法就是计算函数本身的时刻:
function f = U(v,H)
a = v(1);
b = v(2);
c = v(3);
f = a*mean(H1) + b*var(H1)+ c*skewness(H1);
end
或将预先计算的值添加到参数列表中:
function f = U(v,EH1,VH1,SH1)
a = v(1);
b = v(2);
c = v(3);
f = a*EH1 + b*VH1+ c*SH1;
end
另一种选择是将整个代码包装在一个函数中,因此U
是一个嵌套函数,可以访问其父工作区。这没关系,但是从基础工作区中删除了数据,这可能很烦人。
最后一个选项,我不建议但是为了完整性而提及,是明确地将工作空间之间的变量与global
相关联;但是,这个选项对于更复杂的程序来说不能很好地扩展,并且只有在出于某种原因,所有其他途径都失败时才会被使用,并且理解它不是世界上最好的东西,应该尽可能地删除