0001 function varargout = svd(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 VERSION = '$Id: svd.html,v 1.14 2008/03/31 10:27:33 hewitson Exp $';
0043 CATEGORY = 'Operator';
0044
0045 U = [];
0046 S = [];
0047 V = [];
0048
0049
0050
0051 if nargin == 2
0052 if isa(varargin{1}, 'ao') && ischar(varargin{2})
0053 in = char(varargin{2});
0054 if strcmp(in, 'Params')
0055 varargout{1} = getDefaultPL();
0056 return
0057 elseif strcmp(in, 'Version')
0058 varargout{1} = VERSION;
0059 return
0060 elseif strcmp(in, 'Category')
0061 varargout{1} = CATEGORY;
0062 return
0063 end
0064 end
0065 end
0066
0067
0068 in_names = {};
0069 for ii = 1:nargin
0070 in_names{end+1} = inputname(ii);
0071 end
0072
0073 [as, pl, invars] = collect_inputs(varargin, in_names);
0074
0075 if ~isempty (pl)
0076 pl = combine(pl);
0077 end
0078
0079
0080 if ~isempty (pl)
0081 pl = combine(pl);
0082 end
0083
0084
0085 for j=1:numel(as)
0086 a = as(j);
0087
0088 d = get(a, 'data');
0089 dinfo = whos('d');
0090
0091
0092 dtype = dinfo.class;
0093
0094 udata = [];
0095 sdata = [];
0096 vdata = [];
0097
0098 switch dtype
0099 case 'cdata'
0100 if nargout <= 1
0101 [h, udata] = single_operation(a.data, 'svd',pl);
0102 elseif nargout == 2
0103 [h, udata, sdata] = single_operation(a.data, 'svd',pl);
0104 elseif nargout == 3
0105 [h, udata, sdata, vdata] = single_operation(a.data, 'svd',pl);
0106 end
0107
0108 h = set(h, 'inhists', [a.hist]);
0109
0110
0111 h = set(h, 'invars', cellstr(invars{j}));
0112
0113 u = ao(udata, h);
0114 u = setnh(u, 'name', sprintf('u_svd(%s)', char(invars{j})));
0115 U = [U u];
0116 if ~isempty(sdata)
0117 s = ao(sdata, h);
0118 s = setnh(s, 'name', sprintf('s_svd(%s)', char(invars{j})));
0119 S = [S s];
0120 end
0121 if ~isempty(vdata)
0122 v = ao(vdata, h);
0123 v = setnh(v, 'name', sprintf('v_svd(%s)', char(invars{j})));
0124 V = [V v];
0125 end
0126
0127 case {'tsdata','fsdata','xydata'}
0128 error('### this function works for cdata type AO only')
0129 otherwise
0130 error('### unknown data type.')
0131 end
0132
0133 end
0134
0135
0136 U = reshape(U, size(as));
0137 varargout{1} = U;
0138
0139 if nargout > 1
0140
0141 S = reshape(S, size(as));
0142 varargout{2} = S;
0143 if nargout > 2
0144
0145 V = reshape(V, size(as));
0146 varargout{3} = V;
0147 if nargout > 3
0148 error('### wrong number of outputs')
0149 end
0150 end
0151 end
0152
0153
0154 function plo = getDefaultPL()
0155
0156 plo = plist();
0157 plo = append(plo, 'option', []);
0158
0159