0001 function p = zero(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 VERSION = '$Id: zero.html,v 1.14 2008/03/31 10:27:37 hewitson Exp $';
0025 CATEGORY = 'Constructor';
0026
0027
0028 if nargin == 2
0029 if isa(varargin{1}, 'zero') && ischar(varargin{2})
0030 in = char(varargin{2});
0031 if strcmp(in, 'Params')
0032 p = plist;
0033 return
0034 elseif strcmp(in, 'Version')
0035 p = VERSION;
0036 return
0037 elseif strcmp(in, 'Category')
0038 p = CATEGORY;
0039 return
0040 end
0041 end
0042 end
0043
0044
0045
0046 function p = init(version)
0047 p.name = 'None';
0048 p.f = NaN;
0049 p.q = NaN;
0050 p.ri = NaN;
0051 p.version = version;
0052 p.created = time;
0053 p.plist = plist;
0054 p = class(p, 'zero');
0055 end
0056
0057
0058
0059
0060 if nargin == 0
0061
0062 p = init(VERSION);
0063
0064 elseif nargin == 1
0065
0066
0067 if ischar(varargin{1})
0068
0069 filename = varargin{1};
0070 [path, name, ext, vers] = fileparts(filename);
0071 switch ext
0072 case '.mat'
0073 p = load(filename);
0074 p = p.a;
0075 case '.xml'
0076 root_node = xmlread(filename);
0077 p = ltpda_xmlread(root_node, 'zero');
0078 otherwise
0079 error('### Unknown file type.');
0080 end
0081
0082
0083
0084 elseif isnumeric(varargin{1})
0085
0086 p = init(VERSION);
0087
0088 if isreal(varargin{1})
0089 p.name = 'real zero';
0090 p.f = varargin{1};
0091 p.q = NaN;
0092 p.ri = pfq2ri(p.f);
0093 else
0094 p.name = 'complex zero';
0095 [p.f, p.q] = pri2fq(varargin{1});
0096 if length(varargin{1}) == 1
0097 p.ri = [varargin{1}; conj(varargin{1})];
0098 elseif length(varargin{1}) == 2
0099 p.ri = varargin{1};
0100 else
0101 error('### Unknown constructor method. Please specify a complex number or a complex conjugate pair.');
0102 end
0103 end
0104
0105
0106 elseif isstruct(varargin{1})
0107
0108 p = init(VERSION);
0109
0110 fields = fieldnames(varargin{1});
0111 for ii = 1:length(fields)
0112 field = fields{ii};
0113 try
0114 p.(field) = varargin{1}.(field);
0115 catch
0116 error('### The field ''%s'' in the struct is not a zero property.', field)
0117 end
0118 end
0119
0120
0121 elseif isa(varargin{1}, 'plist')
0122
0123
0124 if nparams(varargin{1}) == 0
0125 p = init(VERSION);
0126 p.plist = varargin{1};
0127 else
0128
0129 p = init(VERSION);
0130 p = zeroFromPlist(p, varargin{1});
0131
0132
0133 p.plist = varargin{1};
0134 end
0135
0136
0137 elseif isa(varargin{1}, 'zero')
0138 p = varargin{1};
0139
0140 else
0141 error('### unknown constructor method for zero class.');
0142 end
0143
0144 elseif nargin == 2
0145
0146 if isa(varargin{1}, 'database')
0147 p = retrieve(varargin{1}, varargin{2:end});
0148
0149 elseif isnumeric(varargin{1}) && isnumeric(varargin{2})
0150
0151 ri = pfq2ri(varargin{1}, varargin{2});
0152
0153 if length(ri) == 2 && isreal(ri(1)) && ri(1) == ri(2)
0154 disp('- splitting to two real zeros');
0155 p = init(VERSION);
0156 if isnan(varargin{2})
0157 p.name = 'real zero';
0158 else
0159 p.name = 'complex zero';
0160 end
0161 p.f = varargin{1};
0162 p.q = varargin{2};
0163 p.ri = ri;
0164 p = [p p];
0165 else
0166 p = init(VERSION);
0167 if isnan(varargin{2})
0168 p.name = 'real zero';
0169 else
0170 p.name = 'complex zero';
0171 end
0172 p.f = varargin{1};
0173 p.q = varargin{2};
0174 p.ri = ri;
0175 end
0176
0177 else
0178 error('### unknown constructor method for zero class.');
0179 end
0180
0181 end
0182
0183
0184
0185
0186 function p = zeroFromPlist(p, pl)
0187
0188 f = find(pl, 'f');
0189 q = find(pl, 'q');
0190 ri = find(pl, 'ri');
0191
0192 name = find(pl, 'name');
0193 version = find(pl, 'version');
0194 created = find(pl, 'created');
0195
0196 if ~isempty(f)
0197 if ~isempty(q)
0198
0199 if isnan(q)
0200 p.name = 'real zero';
0201 else
0202 p.name = 'complex zero';
0203 end
0204 p.f = f;
0205 p.q = q;
0206 p.ri = pfq2ri(p.f, p.q);
0207
0208 else
0209
0210 p.name = 'real zero';
0211 p.f = f;
0212 p.q = NaN;
0213 p.ri = pfq2ri(p.f);
0214
0215 end
0216 elseif ~isempty(ri)
0217
0218 p.name = 'complex zero';
0219 [p.f, p.q] = pri2fq(ri);
0220 p.ri = [ri; conj(ri)];
0221
0222 else
0223 error('### unknown constructor method for zero class.');
0224 end
0225
0226
0227 if ~isempty(name)
0228 p.name = name;
0229 end
0230 if ~isempty(version)
0231 p.version = version;
0232 end
0233 if ~isempty(created)
0234 p.created = created;
0235 end
0236
0237 end
0238
0239
0240 end
0241