forked from pdollar/toolbox
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetPrmDflt.m
85 lines (80 loc) · 2.84 KB
/
getPrmDflt.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function varargout = getPrmDflt( prm, dfs, checkExtra )
% Helper to set default values (if not already set) of parameter struct.
%
% Takes input parameters and a list of 'name'/default pairs, and for each
% 'name' for which prm has no value (prm.(name) is not a field or 'name'
% does not appear in prm list), getPrmDflt assigns the given default
% value. If default value for variable 'name' is 'REQ', and value for
% 'name' is not given, an error is thrown. See below for usage details.
%
% USAGE (nargout==1)
% prm = getPrmDflt( prm, dfs, [checkExtra] )
%
% USAGE (nargout>1)
% [ param1 ... paramN ] = getPrmDflt( prm, dfs, [checkExtra] )
%
% INPUTS
% prm - param struct or cell of form {'name1' v1 'name2' v2 ...}
% dfs - cell of form {'name1' def1 'name2' def2 ...}
% checkExtra - [0] if 1 throw error if prm contains params not in dfs
% if -1 if prm contains params not in dfs adds them
%
% OUTPUTS (nargout==1)
% prm - parameter struct with fields 'name1' through 'nameN' assigned
%
% OUTPUTS (nargout>1)
% param1 - value assigned to parameter with 'name1'
% ...
% paramN - value assigned to parameter with 'nameN'
%
% EXAMPLE
% dfs = { 'x','REQ', 'y',0, 'z',[], 'eps',1e-3 };
% prm = getPrmDflt( struct('x',1,'y',1), dfs )
% [ x y z eps ] = getPrmDflt( {'x',2,'y',1}, dfs )
%
% See also INPUTPARSER
%
% Piotr's Computer Vision Matlab Toolbox Version 2.60
% Copyright 2014 Piotr Dollar. [pdollar-at-gmail.com]
% Licensed under the Simplified BSD License [see external/bsd.txt]
if( mod(length(dfs),2) ), error('odd number of default parameters'); end
if nargin<=2, checkExtra = 0; end
% get the input parameters as two cell arrays: prmVal and prmField
if iscell(prm) && length(prm)==1, prm=prm{1}; end
if iscell(prm)
if(mod(length(prm),2)), error('odd number of parameters in prm'); end
prmField = prm(1:2:end); prmVal = prm(2:2:end);
else
if(~isstruct(prm)), error('prm must be a struct or a cell'); end
prmVal = struct2cell(prm); prmField = fieldnames(prm);
end
% get and update default values using quick for loop
dfsField = dfs(1:2:end); dfsVal = dfs(2:2:end);
if checkExtra>0
for i=1:length(prmField)
j = find(strcmp(prmField{i},dfsField));
if isempty(j), error('parameter %s is not valid', prmField{i}); end
dfsVal(j) = prmVal(i);
end
elseif checkExtra<0
for i=1:length(prmField)
j = find(strcmp(prmField{i},dfsField));
if isempty(j), j=length(dfsVal)+1; dfsField{j}=prmField{i}; end
dfsVal(j) = prmVal(i);
end
else
for i=1:length(prmField)
dfsVal(strcmp(prmField{i},dfsField)) = prmVal(i);
end
end
% check for missing values
if any(strcmp('REQ',dfsVal))
cmpArray = find(strcmp('REQ',dfsVal));
error(['Required field ''' dfsField{cmpArray(1)} ''' not specified.'] );
end
% set output
if nargout==1
varargout{1} = cell2struct( dfsVal, dfsField, 2 );
else
varargout = dfsVal;
end