MATLAB函数声明未定义变量

MATLAB函数声明未定义变量,matlab,Matlab,我对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

我对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);

我不确定哪里出了问题。

MATLAB的范围规则是这样的,默认情况下,基本工作区和函数工作区之间不会共享数据:

基本工作区存储在命令行中创建的变量。这包括脚本创建的任何变量,假设您从命令行或编辑器运行脚本

函数不使用基本工作空间。每个函数都有自己的函数工作区。每个功能工作区都独立于基本工作区和所有其他工作区,以保护数据的完整性

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
是一个嵌套函数,可以访问其父工作区。这没关系,但会从基本工作区中删除数据,这可能会让人恼火


最后一个选项,我不推荐,但为了完整起见,我会提到,它是用
全局
显式链接工作区之间的变量;但是,对于更复杂的程序,此选项不能很好地扩展,并且只有在出于某种原因,所有其他方法都失败了,因为它们都认为这不是世界上最好的方法,应该尽可能地删除它。

MATLAB的范围规则是,默认情况下,基本工作区和函数工作区之间不会共享数据:

基本工作区存储在命令行中创建的变量。这包括脚本创建的任何变量,假设您从命令行或编辑器运行脚本

函数不使用基本工作空间。每个函数都有自己的函数工作区。每个功能工作区都独立于基本工作区和所有其他工作区,以保护数据的完整性

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
是一个嵌套函数,可以访问其父工作区。这没关系,但会从基本工作区中删除数据,这可能会让人恼火

最后一个选项,我不推荐,但为了完整起见,我会提到,它是用
全局
显式链接工作区之间的变量;然而,对于更复杂的程序来说,这个选项不能很好地扩展,只有在出于某种原因,所有其他途径都失败了,并且认为它不是世界上最好的东西,并且应该尽可能地删除时,才应该使用它