www.gusucode.com > symbolic工具箱matlab源码程序 > symbolic/@sym/private/cumsumprod.m
function r = cumsumprod(op, A, varargin) %CUMSUMPROD Symbolic cumulative sum or product of elements. % CUMSUMPROD('_plus', ...) computes CUMSUM(...) % CUMSUMPROD ('_mult', ...) computes CUMPROD(...) % Copyright 2014 The MathWorks, Inc. % cumsum and cumprod have checked that nargin >= 2 and nargin <= 4 switch nargin case 2 dim = 0; direction = 'Forward'; case 3 if isa(varargin{1}, 'char') dim = 0; direction = validatestring(varargin{1}, {'Forward','Reverse'}); else dim = checkdim(varargin{1}); direction = 'Forward'; end case 4 dim = checkdim(varargin{1}); direction = validatestring(varargin{2}, {'Forward','Reverse'}); end if ~isa(A, 'sym') if strcmp(op, '_plus') r = cumsum(A, double(dim), direction); else r = cumprod(A, double(dim), direction); end return; end dim = sym(dim); Asym = formula(A); if length(size(Asym)) > 2 error(message('symbolic:sym:cumsumprod:VectorsAndMatrices')); end r = mupadmex('symobj::cumsumprod',Asym.s,dim.s,op,direction); r = privResolveOutput(r, A); % checkdim - checks whether n is a valid dimension function N = checkdim(n) if isa(n, 'sym') n = feval(symengine, 'specfunc::makeInteger', formula(n)); if ~strcmp(mupadmex('testtype',n.s,'Type::PosInt',0),'TRUE') error(message('symbolic:sym:cumsumprod:InvalidDimensionFlag')); end else if ~(isscalar(n) && isnumeric(n) && n==round(n) && n > 0 && isfinite(n)) error(message('symbolic:sym:cumsumprod:InvalidDimensionFlag')); end end N = n;