gpt4 book ai didi

matlab - 使用带有可选输入参数的函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:28 24 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了大约一个星期。我一直在尝试将脚本转换为用于研究目的的函数。问题是代码有很多变量的条件现有语句,因此某些变量在检查时不会存在于工作区中(这就是它作为脚本运行良好的原因)。

Varargin 不是这个问题的解决方案,因为某些函数 INPUTS 将不存在。

工作区

var1 = 1
var2 = 2
var4 = 4

转化为函数的代码

if exist('var3','var')
disp('var 3 exists')
else
disp('var 3 does not exist')
end

以下函数将无法运行,因为它正在调用不存在的变量 3。

调用函数

runCode(var1, var2, var3, var4)

我最初是在我的函数之前写这个的,并让代码检查 isnan 而不是 exist,但这不是很好的做法,因为函数经常被调用,我不不想在代码发生更改时更新此功能设置。

  if ~exist("var1", "var"), var1= NaN; end 
if ~exist("var2", "var"), var2= NaN; end
if ~exist("var3", "var"), var3= NaN; end
if ~exist("var4", "var"), var4= NaN; end

我不想使用 eval,并且加载工作区给我带来了问题,因为出现了一堆数字并且它弄乱了代码后面部分的数字计数。我知道的唯一想法是为前面的 if 语句设置脚本,或者以某种方式将所有工作区数据保存到结构或其他内容中,然后将值分配给相应的 who 字符串(提供工作区变量名)。

感谢你们可能有的任何想法

最佳答案

当前脚本的行为有所不同,具体取决于是否存在一组具有预定义名称的变量。这很难在函数中复制,因为函数不应该读取调用工作区的值。当然,这是可能的:

try
var1 = evalin('caller','var1');
catch
% do nothing, the variable doesn't exist in the caller, it won't exist here
end

但这种真的不好的做法,和脚本没什么区别。并且 OP 特别表示不想使用 eval

还有一个替代方案,我不太愿意推荐它,因为它几乎和上面的一样邪恶。我们将定义一个函数,其输入参数不是基于顺序,而是基于名称:

runCode(var1)

行为将不同于

runCode(var2)

但是下面两个语句的行为是一样的:

runCode(var1,var2)
runCode(var2,var1)

歪了?你应该是!

诀窍是使用 inputname如下:

function runCode(varargin)
for ii = 1:nargin
switch inputname(ii)
case 'var1', var1 = varargin{ii};
case 'var2', var2 = varargin{ii};
case 'var3', var3 = varargin{ii};
case 'var4', var4 = varargin{ii};
otherwise, error('Illegal input argument')
end
end

函数的其余部分将是 OP 脚本的主体,其中包含如下代码:

if exist('var1','var')
% ...
end

也就是说,首先我们看哪些变量被传递给了函数,接下来我们看哪些变量存在。应该可以重写脚本本身,用查找输入参数名称列表来替换 exist 检查。

关于matlab - 使用带有可选输入参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52122228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com