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.m,v 1.20 2008/02/17 11:38:51 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()
0047 p.name = 'not defined';
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();
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();
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();
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 p = init();
0124 p = zeroFromPlist(p, varargin{1});
0125
0126
0127 p.plist = varargin{1};
0128
0129
0130 elseif isa(varargin{1}, 'zero')
0131 p = varargin{1};
0132
0133 else
0134 error('### unknown constructor method for zero class.');
0135 end
0136
0137 elseif nargin == 2
0138
0139 if isa(varargin{1}, 'database')
0140 p = retrieve(varargin{1}, varargin{2:end});
0141
0142 elseif isnumeric(varargin{1}) && isnumeric(varargin{2})
0143
0144 ri = pfq2ri(varargin{1}, varargin{2});
0145
0146 if length(ri) == 2 && isreal(ri(1)) && ri(1) == ri(2)
0147 disp('- splitting to two real zeros');
0148 p = init();
0149 if isnan(varargin{2})
0150 p.name = 'real zero';
0151 else
0152 p.name = 'complex zero';
0153 end
0154 p.f = varargin{1};
0155 p.q = varargin{2};
0156 p.ri = ri;
0157 p = [p p];
0158 else
0159 p = init();
0160 if isnan(varargin{2})
0161 p.name = 'real zero';
0162 else
0163 p.name = 'complex zero';
0164 end
0165 p.f = varargin{1};
0166 p.q = varargin{2};
0167 p.ri = ri;
0168 end
0169
0170 else
0171 error('### unknown constructor method for zero class.');
0172 end
0173
0174 end
0175
0176
0177
0178
0179 function p = zeroFromPlist(p, pl)
0180
0181 f = find(pl, 'f');
0182 q = find(pl, 'q');
0183 ri = find(pl, 'ri');
0184
0185 name = find(pl, 'name');
0186 version = find(pl, 'version');
0187 created = find(pl, 'created');
0188
0189 if ~isempty(f)
0190 if ~isempty(q)
0191
0192 if isnan(q)
0193 p.name = 'real zero';
0194 else
0195 p.name = 'complex zero';
0196 end
0197 p.f = f;
0198 p.q = q;
0199 p.ri = pfq2ri(p.f, p.q);
0200
0201 else
0202
0203 p.name = 'real zero';
0204 p.f = f;
0205 p.q = NaN;
0206 p.ri = pfq2ri(p.f);
0207
0208 end
0209 elseif ~isempty(ri)
0210
0211 p.name = 'complex zero';
0212 [p.f, p.q] = pri2fq(ri);
0213 p.ri = [ri; conj(ri)];
0214
0215 else
0216 error('### unknown constructor method for zero class.');
0217 end
0218
0219
0220 if ~isempty(name)
0221 p.name = name;
0222 end
0223 if ~isempty(version)
0224 p.version = version;
0225 end
0226 if ~isempty(created)
0227 p.created = created;
0228 end
0229
0230 end
0231
0232
0233 end
0234