PDA

查看完整版本 : 如何在MATLAB中处理函数参数的名称/值对


poster
2019-12-10, 20:41
我有一个函数,将可选参数作为名称/值对。

function example(varargin) % Lots of set up stuff vargs = varargin; nargs = length(vargs); names = vargs(1:2:nargs); values = vargs(2:2:nargs); validnames = {'foo', 'bar', 'baz'}; for name = names validatestring(name{:}, validnames); end % Do something ... foo = strmatch('foo', names); disp(values(foo)) end example('foo', 1:10, 'bar', 'qwerty') 似乎在提取适当的值时需要付出很多努力(而且再次输入错误的指定值仍然不是特别可靠)。有没有更好的方法来处理这些名称/值对? MATLAB附带有任何帮助程序功能吗?



回答:

我更喜欢使用结构作为选项。这为您提供了存储选项和定义选项的简便方法。而且,整个事情变得相当紧凑。

function example(varargin) %# define defaults at the beginning of the code so that you do not need to %# scroll way down in case you want to change something or if the help is %# incomplete options = struct('firstparameter',1,'secondparameter',magic(3)); %# read the acceptable names optionNames = fieldnames(options); %# count arguments nArgs = length(varargin); if round(nArgs/2)~=nArgs/2 error('EXAMPLE needs propertyName/propertyValue pairs') end for pair = reshape(varargin,2,[]) %# pair is {propName;propValue} inpName = lower(pair{1}); %# make case insensitive if any(strcmp(inpName,optionNames)) %# overwrite options. If you want you can test for the right class here %# Also, if you find out that there is an option you keep getting wrong, %# you can use "if strcmp(inpName,'problemOption'),testMore,end"-statements options.(inpName) = pair{2}; else error('%s is not a recognized parameter name',inpName) end end

更多&回答... (https://stackoverflow.com/questions/2775263)