Matlab 用于在函数内部从工作区捕获变量值的命令

Matlab 用于在函数内部从工作区捕获变量值的命令,matlab,Matlab,当我在Matlab中做函数时。有时我有方程,每一个都有常数。然后,我必须在函数中声明这些常量。我想知道是否有一种方法可以从函数外部调用该常量的值,如果我在工作区中有它们的值 我不想在函数声明中将此值作为函数的输入写入。解决此问题的最简单方法是通过全局变量: 您还可以在其他工作空间(包括基本工作空间或父工作空间)中获取值,但这是不明智的,因为您不一定知道如何包装给定函数 如果您想选择该路线,请查看evalin功能: 不过,标准的方法是传递所有需要的变量。如果愿意,您可以将它们放入一个结构中,并

当我在Matlab中做函数时。有时我有方程,每一个都有常数。然后,我必须在函数中声明这些常量。我想知道是否有一种方法可以从函数外部调用该常量的值,如果我在工作区中有它们的值


我不想在函数声明中将此值作为函数的输入写入。

解决此问题的最简单方法是通过全局变量:

您还可以在其他工作空间(包括基本工作空间或父工作空间)中获取值,但这是不明智的,因为您不一定知道如何包装给定函数

如果您想选择该路线,请查看evalin功能:


不过,标准的方法是传递所有需要的变量。如果愿意,您可以将它们放入一个结构中,并且只传递一个结构。

解决此问题的最简单方法是通过全局变量:

您还可以在其他工作空间(包括基本工作空间或父工作空间)中获取值,但这是不明智的,因为您不一定知道如何包装给定函数

如果您想选择该路线,请查看evalin功能:


不过,标准的方法是传递所有需要的变量。如果愿意,您可以将它们放入一个结构中,并且只传递一个结构。

除了Iterator提供的解决方案之外,这些解决方案都很好,我认为您还有其他一些选择

首先,我想像迭代器一样警告您全局变量:这些变量引入了隐藏的依赖项,使重用和调试代码变得更加麻烦。如果您唯一关心的是调用函数时的易用性,我建议您传递一个包含这些常量的结构。这样做的好处是可以轻松地将这些常量保存在一起。除非您知道自己在做什么,否则请帮自己一个忙,远离全局变量和函数,如eval、evalin和assignin

除了global、evalin和passing结构之外,还有另一种全局状态机制:首选项。当涉及到几乎不可变的代码设置时,可以使用它们。这些不适合传递实际的原始数据

如果您所需要的只是调用某个函数的大致清晰的语法,可以通过几种不同的方式实现:

可以使用数量可变的参数。当常数具有默认值时,这是最佳选项。我将通过一个例子来解释,例如,规则正弦波y=a*sin2*pi*t/t a是振幅,t是周期。在MATLAB中,可以将其实现为:

function y = sinewave(t,A,T)
y = A*sin(2*pi*t/T);
调用此函数时,需要提供所有参数。如果我们将此函数扩展为如下内容,则可以省略A和T参数:

function y = sinewave(t,A,T)
if nargin < 3
   T = 1; % default period is 1
   if nargin < 2
      A = 1; % default amplitude 1
   end
end
y = A*sin(2*pi*t/T);
这样做的好处是,可以更清楚地了解正在发生的事情,并且可以省略A,但仍然可以指定T。对于前面的示例,可以执行相同的操作,但是当您有很多参数时,这很容易变得复杂。您可以通过调用sinewave1:10、[],4来执行这些操作,其中A将保留其默认值。如果空输入有效,则应使用另一个无效输入,例如NaN、inf或已知为正值的参数的负值

使用上述函数,以下所有调用都是等效的:

t = rand(1,10);
y1 = sinewave(t,1,1);
y2 = sinewave(t,1);
y3 = sinewave(t);
如果参数没有默认值,则可以将函数包装到一个函数句柄中,该句柄将填充这些参数。这是在使用某些工具箱时可能需要执行的操作,这些工具箱会对要使用的函数施加约束。优化工具箱中就是这种情况

我将再次考虑正弦波函数,但这次我使用第一个定义,即没有可变数量的参数。然后可以使用函数句柄:

f = @(x)(sinewave(x,1,1));
您可以像使用其他函数一样使用f:

e、 g.f10将评估正弦波10,1,1

这样,您可以编写一个通用函数,即正弦波函数,它尽可能通用和简单,但您可以动态创建一个函数句柄,并替换常量。这允许您使用该功能,但也阻止了数据的全局存储


当然,您可以组合不同的解决方案:例如,创建一个函数的函数句柄,该函数具有设置某个全局变量的可变数量的参数。

除了迭代器提供的解决方案之外,我认为您还有一些其他选项

首先,我想像迭代器一样警告您全局变量:这些变量引入了隐藏的依赖项,使重用和调试代码变得更加麻烦。如果您唯一关心的是调用函数时的易用性,我建议您传递一个包含这些常量的结构。这样做的好处是可以轻松地将这些常量保存在一起。除非 你知道自己在做什么,帮自己一个忙,远离全局变量和函数,比如eval、evalin和assignin

除了global、evalin和passing结构之外,还有另一种全局状态机制:首选项。当涉及到几乎不可变的代码设置时,可以使用它们。这些不适合传递实际的原始数据

如果您所需要的只是调用某个函数的大致清晰的语法,可以通过几种不同的方式实现:

可以使用数量可变的参数。当常数具有默认值时,这是最佳选项。我将通过一个例子来解释,例如,规则正弦波y=a*sin2*pi*t/t a是振幅,t是周期。在MATLAB中,可以将其实现为:

function y = sinewave(t,A,T)
y = A*sin(2*pi*t/T);
调用此函数时,需要提供所有参数。如果我们将此函数扩展为如下内容,则可以省略A和T参数:

function y = sinewave(t,A,T)
if nargin < 3
   T = 1; % default period is 1
   if nargin < 2
      A = 1; % default amplitude 1
   end
end
y = A*sin(2*pi*t/T);
这样做的好处是,可以更清楚地了解正在发生的事情,并且可以省略A,但仍然可以指定T。对于前面的示例,可以执行相同的操作,但是当您有很多参数时,这很容易变得复杂。您可以通过调用sinewave1:10、[],4来执行这些操作,其中A将保留其默认值。如果空输入有效,则应使用另一个无效输入,例如NaN、inf或已知为正值的参数的负值

使用上述函数,以下所有调用都是等效的:

t = rand(1,10);
y1 = sinewave(t,1,1);
y2 = sinewave(t,1);
y3 = sinewave(t);
如果参数没有默认值,则可以将函数包装到一个函数句柄中,该句柄将填充这些参数。这是在使用某些工具箱时可能需要执行的操作,这些工具箱会对要使用的函数施加约束。优化工具箱中就是这种情况

我将再次考虑正弦波函数,但这次我使用第一个定义,即没有可变数量的参数。然后可以使用函数句柄:

f = @(x)(sinewave(x,1,1));
您可以像使用其他函数一样使用f:

e、 g.f10将评估正弦波10,1,1

这样,您可以编写一个通用函数,即正弦波函数,它尽可能通用和简单,但您可以动态创建一个函数句柄,并替换常量。这允许您使用该功能,但也阻止了数据的全局存储


当然,您可以组合不同的解决方案:例如,创建一个函数的函数句柄,该函数具有设置某个全局变量的可变数量的参数。

如果nargin<2 | | isemptyA,我将使用稍微慢一点的exist语句,而不是使用exist语句etc@Jonas当前位置你可能是对的,exist有点慢,但两种方法都有各自的优点。我发现存在更具表现力,即更容易理解,更容易维护。您可以随意更改参数的顺序。另一方面,nargin隐式地将参数的顺序绑定到函数头之外,因此任何一部分的更改都可能破坏代码。还有另一种表达方式inputParser,但在很多情况下,这可能有点过火了。现在,输入顺序在我的函数中没有改变,因为这意味着找到所有调用它的其他函数,所以对我来说,nargin是安全的。如果nargin<2 | | isemptyA,我会使用稍微慢一些的exist语句,而不是使用exist语句etc@Jonas当前位置你可能是对的,exist有点慢,但两种方法都有各自的优点。我发现存在更具表现力,即更容易理解,更容易维护。您可以随意更改参数的顺序。另一方面,nargin隐式地将参数的顺序绑定到函数头之外,因此任何一部分的更改都可能破坏代码。还有另一种表达方式inputParser,但在很多情况下,这可能有点过火了。现在,输入顺序在我的函数中没有改变,因为这意味着找到所有其他调用它的函数,所以对我来说,nargin是安全的。