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 invars = {};
0023 for j=1:nargin
0024 invars = [invars cellstr(inputname(j))];
0025 end
0026
0027 ALGONAME = mfilename;
0028 VERSION = '$Id: svd.html,v 1.1 2007/06/08 14:15:03 hewitson Exp $';
0029
0030 as = [];
0031 ps = [];
0032 for j=1:nargin
0033 a = varargin{j};
0034 if isa(a, 'ao')
0035 as = [as a];
0036 elseif isa(a, 'plist')
0037 ps = [ps a];
0038
0039
0040 end
0041
0042 end
0043
0044
0045 if ~isempty(ps)
0046 if isa(ps, 'plist')
0047 pl = combine(ps);
0048 end
0049 else
0050 pl = plist();
0051 end
0052
0053 U = [];
0054 S = [];
0055 V = [];
0056
0057
0058 for j=1:length(as)
0059 a = as(j);
0060
0061 d = get(a, 'data');
0062 dinfo = whos('d');
0063
0064
0065 dtype = dinfo.class;
0066
0067 udata = [];
0068 sdata = [];
0069 vdata = [];
0070
0071 switch dtype
0072 case 'cdata'
0073 disp('* DETERMINANT of cdata object');
0074 if nargout <= 1
0075 [h, udata] = single_operation(a.data, 'svd',pl);
0076 elseif nargout == 2
0077 [h, udata, sdata] = single_operation(a.data, 'svd',pl);
0078 elseif nargout == 3
0079 [h, udata, sdata, vdata] = single_operation(a.data, 'svd',pl);
0080 end
0081
0082 h = set(h, 'invars', [a.hist]);
0083 u = ao(udata, h);
0084 u = set(u, 'name', sprintf('u_svd(%s)', char(invars{1})));
0085 U = [U u];
0086 if ~isempty(sdata)
0087 s = ao(sdata, h);
0088 s = set(s, 'name', sprintf('s_svd(%s)', char(invars{1})));
0089 S = [S s];
0090 end
0091 if ~isempty(vdata)
0092 v = ao(vdata, h);
0093 v = set(v, 'name', sprintf('v_svd(%s)', char(invars{1})));
0094 V = [V v];
0095 end
0096
0097 case 'tsdata' & 'fsdata' & 'xydata'
0098 error('### this function works for cdata type AO only')
0099 otherwise
0100 error('### unknown data type.')
0101 end
0102
0103 end
0104
0105 varargout{1} = U;
0106 if nargout > 1
0107 varargout{2} = S;
0108 if nargout > 2
0109 varargout{3} = V;
0110 if nargout > 3
0111 error('### wrong number of outputs')
0112 end
0113 end
0114 end
0115
0116