【发布时间】:2019-02-06 21:16:11
【问题描述】:
我已经为这个问题苦苦挣扎了大约一个星期。我一直在尝试将脚本转换为用于研究目的的函数。问题是代码有很多条件变量的现有语句,所以某些变量在检查时不会存在于工作区中(这就是它作为脚本运行良好的原因)。
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 字符串(给出工作区变量名称)。
感谢你们提出的任何想法
【问题讨论】:
-
所以你的函数中有一堆变量,它们可能存在于工作区中,也可能不存在。如果您的代码依赖于这些变量的存在,您将别无选择,只能检查它们是否存在,如果不存在则创建它们。没有办法解决这个问题。我个人会用函数包装变量的每次出现,例如runCode( safevar(var1), safevar(var2), safevar(var3), safevar(var4) ) 并检查 safevar 中是否存在,如果不存在则通过 eval 创建变量。
-
我会使用 inputParser 对象来解决这个问题。您可以指定名称-值对,以便调用函数
runCode('var1', var1, 'var3', var3, ...)并让 inputParser 为任何未输入的var#分配默认值。除了使用名称值对之外,输入解析器还允许您扩展结构,因此您可以拥有一个带有字段名的结构,{'var1', 'var3'} then pass the struct intorunCode(S)`。另见this answer -
“加载工作区给我带来了问题,因为存在一堆数字,它会在代码的后面部分弄乱数字计数。”我不明白这一点。一些代码取决于是否有图窗打开?您无法解决将代码更改为函数的问题,图形窗口是全局事物,基础工作区和您调用的函数的工作区中的计数相同。
-
据我了解,您有一个脚本根据存在的变量执行不同的操作。您也可以在函数中执行此操作,使用
evalin,但我不知道这是否比保留脚本更好。我没有看到任何其他解决方法。函数应该只读取传递给它的值,因此您需要使用相关变量调用函数。无论是否定义了变量,它的行为都不应该有所不同。我会说保留它作为脚本!
标签: matlab function scripting optional-parameters variable-declaration